![用文件内容替换两个模式之间的所有行(含)](https://linux22.com/image/1005544/%E7%94%A8%E6%96%87%E4%BB%B6%E5%86%85%E5%AE%B9%E6%9B%BF%E6%8D%A2%E4%B8%A4%E4%B8%AA%E6%A8%A1%E5%BC%8F%E4%B9%8B%E9%97%B4%E7%9A%84%E6%89%80%E6%9C%89%E8%A1%8C%EF%BC%88%E5%90%AB%EF%BC%89.png)
标题中已经说了,我想用文件内容替换两个模式之间的所有行。
文件1
line 1
line 2
foo
foobar
bar
line 6
line 7
文件2
line 3
line 4
line 5
所需文件
line 1
line 2
line 3
line 4
line 5
line 6
line 7
尝试了许多 sed 命令对我都不起作用,下面最接近的命令成功匹配 foo 和 bar 之间的行,但将它们替换为“$(cat file2)”字符串而不是文件内容。
sed '/foo/{:a;N;/bar/!ba;N;s/.*\n/$(cat file2)/};p' file1
答案1
我认为你已经接近了 - 你的主要问题是它将$(cat file2)
被视为单引号内的文字 - 你应该使用内置r
命令:
r filename
将 filename 的内容排队,以便在当前循环结束时或读取下一个输入行时将其插入到输出流中。请注意,如果 filename 无法读取,则将其视为空文件,没有任何错误指示。
所以:
sed '
/foo/{
:a
N
/\nbar$/!ba
r file2
d
}
' file1
如果您想将其变成一行,那么您需要一个技巧来防止 sed 将r
文件名之后的所有内容视为:
sed -e '/foo/{:a; N; /\nbar$/!ba; r file2' -e 'd;}' file1