Sed

使用 sed 將文件中的指定字元串替換為來自其他文件的字元串

  • August 14, 2021

我有兩個這樣的文件。

文件 1

line 1
line 2
... (more lines)
aaa PLACEHOLDER bbb ccc
... (more lines)
ddd PLACEHOLDER eee fff
... (more lines)
etc

文件2

NEWTEXT1
NEWTEXT2
... (more lines)

file2 中 NEWTEXT 字元串的數量總是與 file1 中帶有 PLACEHOLDER 的行的數量相同。我不知道 PLACEHOLDER 字元串在 file1 中的哪一行,並且 PLACEHOLDER 字元串的數量可能因文件 file1 和 file2 的不同集而異。

我想用文件 2 中的相應字元串替換每個 PLACEHOLDER。所以對於這個例子,新文件是

line 1
line 2
... (more lines)
aaa NEWTEXT1 bbb ccc
... (more lines)
ddd NEWTEXT2 eee fff
... (more lines)
etc

這可能與 sed 謝謝。

我們可以使用GNU sed流編輯器並將 file2 中的一個 newtext 行放在佔位符行下方,然後在下一次呼叫 sed 時加入它們:-

sed -e '/PLACEHOLDER/R file2' file1 |
sed -Ee '
 /PLACEHOLDER/N
 s/PLACEHOLDER(.*)\n(.*)/\2\1/
'  -

結果:-

line 1
line 2
... (more lines)
aaa NEWTEXT1 bbb ccc
... (more lines)
ddd NEWTEXT2 eee fff
... (more lines)
etc

以上的單行版本:

$ sed -e '/PLACEHOLDER/R file2' file1 | sed -Ee '/PLACEHOLDER/N;s/PLACEHOLDER(.*)\n(.*)/\2\1/' -

我會使用perl

perl -pe '
 s{PLACEHOLDER}{
   $replacement = <STDIN>;
   chomp $replacement;
   $replacement
 }ge' file1 < file2

PLACEHOLDER這也允許每行替換多個。

引用自:https://unix.stackexchange.com/questions/664619