sed:用文件内容

时间:2016-06-30 23:53:18

标签: bash replace sed insert

在这里和其他地方有很多例子可以使用sed的'r'代替模式,但它似乎不适用于某个范围,但也许我只是没有把握它。

以下按预期工作,删除BEGIN PATTERN并将其替换为/ tmp / somefile的内容。

sed -n "/BEGIN PATTERN/{ r /tmp/somefile d }" TARGET_FILE

但是,这只会将END_PATTERN替换为/ tmp / somefile。

的内容
 sed -n "/BEGIN PATTERN/,/END PATTERN/ { r /tmp/somefile d }" TARGET_FILE

我想我也可以尝试perl或awk这样做,但似乎sed应该能够做到这一点。

2 个答案:

答案 0 :(得分:1)

我相信这可以做你想要的:

sed  $'/BEGIN PATTERN/r somefile\n /BEGIN PATTERN/,/END PATTERN/d' file

或者:

sed  -e '/BEGIN PATTERN/r somefile' -e '/BEGIN PATTERN/,/END PATTERN/d' file

如何运作

  • /BEGIN PATTERN/r somefile

    每当找到BEGIN PATTERN时,都会插入somefile的内容。

  • /BEGIN PATTERN/,/END PATTERN/d

    每当我们处于从/BEGIN PATTERN/行到/END PATTERN/行的范围内时,我们删除(d)模式缓冲区的包含。

实施例

让我们考虑这两个测试文件:

$ cat file
prelude
BEGIN PATTERN
middle
END PATTERN
afterthought

$ cat somefile
This is
New.

我们的命令产生:

$ sed  $'/BEGIN PATTERN/r somefile\n /BEGIN PATTERN/,/END PATTERN/d' file
prelude
This is
New.
afterthought

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -e '/BEGIN PATTERN/,/END PATTERN/{/END PATTERN/!d;r somefile' -e 'd}' file