在模式匹配之间从文件中删除行

时间:2019-04-17 06:42:12

标签: shell 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

3 个答案:

答案 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 完成的!

在MacOS下, BSD 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