使用 sed 将文件中的指定字符串替换为其他文件中的字符串

使用 sed 将文件中的指定字符串替换为其他文件中的字符串

我有两个这样的文件。

文件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 的不同集而异。

我想将每个 PLACEHOLDER 替换为文件 2 中相应的字符串。因此对于本示例,新文件将是

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

这可以用 sed 实现吗?谢谢。

答案1

我会用perl

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

PLACEHOLDER这还允许每行替换多个。

答案2

我们可以使用GNU sed流编辑器并将 file2 中的一个新文本行放在占位符行下方,然后在下一次调用 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/' -

相关内容