如何使用sed删除文件中两个模式之间的所有行。
这里的模式为//test
和//endtest
,文件内容:
blah blah blah
c
f
f
[
]
//test
all text to be deleted
line1
line2
xyz
amv
{
//endtest
l
dsf
dsfs
预期结果:
blah blah blah
c
f
f
[
]
//test
//endtest
l
dsf
dsfs
答案 0 :(得分:3)
sed
sed '/^\/\/test$/,/^\/\/endtest/d'
由于/
用于绑定正则表达式,因此必须在正则表达式中对其进行转义。
如果要保留商标(按要求):
sed '/^\/\/test$/,/^\/\/endtest/{//!d}'
说明:
看看info sed
,搜索 sed address
-> Regexp Addresses
和 Range Addresses
。
用{ ... }
括起来的符号//
表示任何界限。
空的正则表达式'//'重复最后一个正则表达式 表达式匹配(如果空正则表达式为 传递给“ s”命令。
!
表示 not
,然后d
表示 delete line
替代:您可以编写:
sed '/^\/\/\(end\)\?test$/,//{//!d}'
或
sed -E '/^\/\/(end)?test$/,//{//!d}'
将同样起作用,但请注意,如果在第一个打开模式(//endtest
之前
...这一切都是使用 GNU //test
4.4 完成的!
sed
在MacOS下,我已使用以下语法成功删除了所需的行:
sed
或
sed '/^\/\/test$/,/^\/\/endtest/{/^\/\/\(end\)\{0,1\}test$/!d;}'
答案 1 :(得分:2)
使用awk:
$ awk '/\/\/endtest/{p=0} !p; /\/\/test/{p = 1}' file
blah blah blah
c
f
f
[
]
//test
//endtest
l
dsf
dsfs
答案 2 :(得分:0)
如果您的数据位于“ d”文件中,请尝试使用gnu sed:
sed -E '/\/\/test/,/\/\/endtest/{/\/\/.*test/!d}' d