如何使用 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

相關內容