0

我有一个包含特定字符串的源文件,并且想用另一个文件的内容替换该字符串的第一个(在这种情况下,仅)实例。就像是:

> cat source.txt
Hello
KEYWORD
Hi
> cat replacement.txt
Replacement
> <sed command>
> cat source.txt
Hello
Replacement
Hi

有没有办法用 sed 做到这一点?还是其他编辑?

4

3 回答 3

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 有单行还是多行,上述行都有效。

例如:

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

你可以看到,只有KEYWORDfile1 中的第一个被替换了。但是 awk 无法将更改写回输入文件。我们能做的是:

awk '...' replace.txt src.txt > /tmp/t.txt && mv /tmp/t.txt /path/to/src.txt

awk one-liner 用 gawk 进行了测试。不保证它适用于所有 awk 实现。如果你有一个非 gnu awk,你应该测试它。

感谢Ed Morton的建议。

于 2013-04-30T23:34:39.150 回答
0

一种快速简便的方法:

sed s/KEYWORD/`cat replacement.txt`/ source.txt > output.txt
于 2013-04-30T23:38:00.583 回答
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

$
于 2013-04-30T23:38:16.553 回答