我有两个这样的文件。
文件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/' -