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.txt
darf 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, sed
dann sehen Siehttps://stackoverflow.com/q/29613304/1745001.