在这里和其他地方有很多例子可以使用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应该能够做到这一点。
答案 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