如何使用 bash 脚本将文件特定位置中的文本替换为另一个文件中的文本?

如何使用 bash 脚本将文件特定位置中的文本替换为另一个文件中的文本?

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

相关内容