我有一个包含特定字符串的源文件,并希望用另一个文件的内容替换该字符串的第一个(在这种情况下,只是)实例。类似的东西:
> cat source.txt
Hello
KEYWORD
Hi
> cat replacement.txt
Replacement
> <sed command>
> cat source.txt
Hello
Replacement
Hi
有没有办法用sed做到这一点?还是其他编辑?
答案 0 :(得分:1)
我认为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有单行还是多行,上面的行都可以正常工作。
e.g:
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
用pawk测试了awk单线。不保证它适用于所有awk实现。你应该测试它,如果你有一个非gnu awk。
感谢 Ed Morton 的建议。
答案 1 :(得分:0)
快速简便的方法:
sed s/KEYWORD/`cat replacement.txt`/ source.txt > output.txt
答案 2 :(得分:0)
$ cat source.txt
Hello
KEYWORD
Hi
KEYWORD
KEYWORD
$ cat replacement.txt
Replacement
multiline?
$ sed -ir "0,/KEYWORD/s//$(cat replacement.txt | sed 's/$/^M/'|tr -d '\n' ) )/" source.txt
$ cat source.txt
Hello
Replacement
multiline?
Hi
KEYWORD
KEYWORD
$