我想使用 sed
(我想?)用文件内容替换模式。
例子
文件 1(主文件)
Hello <<CODE>>
Goodbye.
文件2(内容)
Anonymous person,
I am very nice.
文件 3(目标)
Hello Anonymous person,
I am very nice.
Goodbye.
现在,我正在使用这个命令:
sed "/<<CODE>>/{r file2
:a;n;ba}" file1 | \
sed "s/<<CODE>>//g" > \
file3
但是这个输出:
Hello
Anonymous person,
I am very nice.
Goodbye.
(注意 Hello
之后的换行符)
- 如果不获取换行符,我如何做到这一点?
- (请注意
file2
可能包含各种内容:括号、换行符、引号……)
- (请注意
最佳答案
使用 awk 更简单:
awk 'FNR==NR{s=(!s)?$0:s RS $0;next} /<<CODE>>/{sub(/<<CODE>>/, s)} 1' file2 file1
Hello Anonymous person,
I am very nice.
Goodbye.
解释:
-
FNR==NR
- 为输入中的第一个文件执行此 block ,即file2
-
s=(!s)?$0:s RS $0
- 在字符串中连接整个文件内容s
-
next
- 阅读下一行直到EOF
在第一个文件上 -
/<<CODE>>/
- 如果一行带有<<CODE>>
被发现执行那个 block -
sub(/<<CODE>>/, s)
- 替换<<CODE>>
带字符串s
(file2
的数据) -
1
- 打印输出
编辑: 非正则表达式方式:
awk 'FNR==NR{s=(!s)?$0:s RS $0; next}
i=index($0, "<<CODE>>"){$0=substr($0, 1, i-1) s substr($0, i+8)} 1' file2 file1
关于regex - Sed 用文件内容替换模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27361981/