Wie ersetze ich mithilfe eines Bash-Skripts Text, der sich an einer bestimmten Stelle einer Datei befindet, durch Text, der sich in einer anderen Datei befindet?

Wie ersetze ich mithilfe eines Bash-Skripts Text, der sich an einer bestimmten Stelle einer Datei befindet, durch Text, der sich in einer anderen Datei befindet?

Nehmen wir also an, ich habe eine Textdatei,zu ändernde Datei.txt:

3.141592       pi
6.626068       planck

# Like this and like that and like this
..1     kd6-officer kd6-officer
us..0 kd6-3.7
us00..0 kd6-3.8
us00..0 kd6-3.9
us00..0 kd6-3.1

Und ich habe eine zweite Datei,Unterdatei.txt:

subtext

Ich möchte das Wort in Spalte zwei, Zeile zwei, vonzu ändernde Datei.txtmit dem Wort inUnterdatei.txt; das Wort inUnterdatei.txtwird nicht immer sein subtext; das Wort inzu ändernde Datei.txtwird nicht immer sein planck. Es wäre am besten anzunehmen, dass beide Wörter in beiden Dateienstetskönnen völlig andere Wörter sein.

Antwort1

Um die nicht leeren Zeichen vor dem Zeilenende in Zeile 2 zu ändern, können Sie verwenden

sed -i'' -e '2{s/[^[:blank:]]*$/'"$(cat subfile.txt)"'/;}' filetobechanged.txt

Die -i''Option bearbeitet die Datei direkt (GNU/BSD sed). Ihr Wort in subfile.txtdarf keine /Zeichen enthalten, oder Sie müssten das /'s im Befehl durch ein Zeichen ersetzen, das in Wort nicht vorhanden ist (z. B. @oder ,).

Antwort2

Wenn es Ihnen egal ist, ob Leerzeichen zwischen den Feldern erhalten bleiben, funktioniert dies mit jedem awk in jeder Shell auf jedem UNIX-Rechner und mit allen Zeichen in den Eingabedateien, da es sich lediglich um eine wörtliche Zeichenfolgenzuweisung handelt:

awk 'NR==FNR{new=$0; next} NR==2{$2=new} 1' subfile.txt filetobechanged.txt

Wenn es Ihnen wichtig ist, dann:

awk 'NR==FNR{new=$0; next} NR==2{sub(/[^[:space:]]+$/,""); $0=$0 new} 1' subfile.txt filetobechanged.txt

So ersetzen Sie das X-te Wort in der Y-ten Zeile mit GNU awk für das 3. Argument für match():

awk -v x=5 -v y=3 '
    NR==FNR { new=$0; next }
    FNR==y {
        match($0,"([[:space:]]*([^[:space:]]+[[:space:]]+){"x-1"})[^[:space:]]+(.*)",a)
        $0 = a[1] new a[3]
    }
1' subfile.txt filetobechanged.txt

z.B:

$ cat subfile.txt
[[[ \1 ~`!@#$%^&*()_-+={[}]|\:;"'<,>.?/ ]]]

$ cat filetobechanged.txt
Now is the winter of our discontent
Made glorious summer by this sun of York;
And all the clouds that lour'd upon our house
In the deep bosom of the ocean buried.

$ awk -v x=5 -v y=3 '
    NR==FNR { new=$0; next }
    FNR==y {
        match($0,"([[:space:]]*([^[:space:]]+[[:space:]]+){"x-1"})[^[:space:]]+(.*)",a)
        $0 = a[1] new a[3]
    }
1' subfile.txt filetobechanged.txt
Now is the winter of our discontent
Made glorious summer by this sun of York;
And all the clouds [[[ \1 ~`!@#$%^&*()_-+={[}]|\:;"'<,>.?/ ]]] lour'd upon our house
In the deep bosom of the ocean buried.

Wenn Sie etwas Ähnliches tun möchten, seddann sehen Siehttps://stackoverflow.com/q/29613304/1745001.

verwandte Informationen