用文件内容替换两个模式之间的所有行(含)

用文件内容替换两个模式之间的所有行(含)

标题中已经说了,我想用文件内容替换两个模式之间的所有行。

文件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

相关内容