假设我有一个文本文件,待更改文件.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。