我认为 awk 可以更轻松地完成这项工作:
如果你想在replace.txt中保留结束的换行符:
awk -v RS="\0" -v ORS="" 'NR==FNR{r=$0;next}{sub(/KEYWORD/,r)}1' replace.txt source.txt
如果您想从 replace.txt 中删除结尾 \n:
awk -v RS="\0" -v ORS="" 'NR==FNR{r=$0;sub(/\n$/,"",r);next}{sub(/KEYWORD/,r)}1' replace.txt source.txt
无论您的 replace.txt 是单行还是多行,上述行都有效。
例如:
kent$ head file1 file2
==> file1 <==
Hello
KEYWORD
Hi
KEYWORD
==> file2 <==
rep_line1
rep_line2
kent$ awk -v RS="\0" -v ORS="" 'NR==FNR{r=$0;next}{sub(/KEYWORD\n/,r)}1' file2 file1
Hello
rep_line1
rep_line2
Hi
KEYWORD
你可以看到,只有file1中的第一个KEYWORD被替换了。但是 awk 无法将更改写回输入文件。我们能做的是:
awk '...' replace.txt src.txt > /tmp/t.txt && mv /tmp/t.txt /path/to/src.txt
用 gawk 测试了 awk 单行。不保证它适用于所有 awk 实现。如果你有一个非 gnu awk,你应该测试它。
感谢Ed Morton的建议。