假設我有一個文字文件,待更改文件.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
我還有第二個文件,子文件.txt:
subtext
我想更改第二列第二行中的單字待更改文件.txt這個詞在子文件.txt;這個詞在子文件.txt不會永遠是subtext
;這個詞在待更改文件.txt不會總是這樣planck
。最好假設兩個檔案中的兩個單字都會總是是完全不同的字。
答案1
若要變更第 2 行行尾之前的非空白字符,您可以使用
sed -i'' -e '2{s/[^[:blank:]]*$/'"$(cat subfile.txt)"'/;}' filetobechanged.txt
此-i''
選項就地編輯檔案 (GNU/BSD sed)。您的單字 insubfile.txt
可能不包含任何/
字符,或者您必須將/
命令中的 替換為單字中不存在的字符(例如@
或,
)。
答案2
如果您不關心保留字段之間的空白,則可以在每個 UNIX 機器上的任何 shell 中使用任何 awk,並在任一輸入檔案中給出任何字符,因為它只是執行文字字串賦值:
awk 'NR==FNR{new=$0; next} NR==2{$2=new} 1' subfile.txt filetobechanged.txt
如果你確實關心的話:
awk 'NR==FNR{new=$0; next} NR==2{sub(/[^[:space:]]+$/,""); $0=$0 new} 1' subfile.txt filetobechanged.txt
要使用 GNU awk 取代第 Y 行上的第 X 個字作為 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
例如:
$ 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.
如果您想做類似的事情,sed
請參閱https://stackoverflow.com/q/29613304/1745001。