sed:删除两个模式之间的字符串,使第二个模式保持不变(包括一半)

时间:2013-06-13 06:43:35

标签: regex filter sed awk

我正在尝试在两种模式之间过滤掉文本,我已经看过十几个例子但是没有设法得到我想要的内容:

示例输入:

START LEAVEMEBE text
   data
START DELETEME text
   data
   more data
   even more
START LEAVEMEBE text
   data
   more data

START DELETEME text
   data
   more

SOMETHING that doesn't start with START
@ sometimes it starts with characters that needs to be escaped...

我想留下来:

START LEAVEMEBE text
   data
START LEAVEMEBE text
   data
   more data


SOMETHING that doesn't start with START
@ sometimes it starts with characters that needs to be escaped...

我尝试使用:

运行sed
sed 's/^START DELETEME/,/^[^ ]/d'

并获得包容性删除,我尝试添加“排除”(不确定我是否真的理解这种语法):

sed 's/^START DELETEME/,/^[^ ]/{/^[^ ]/!d}'

但是我的“START DELETEME”系列仍然存在(是的,我可以把它弄出来,但那很难看:)除此之外 - 它还删除了此示例中的空行并且我想留下空行如果他们是我的完整模式完整) 我想知道是否有办法用一个sed命令来做到这一点。 我有一个很好的awk脚本:

BEGIN { flag = 0 }
        {
                if ($0 ~ "^START DELETEME")
                        flag=1
                else if ($0 !~ "^ ")
                        flag=0

                if (flag != 1)
                        print $0
        }

但是你知道“A是为了像蜗牛一样运行的awk”。这需要永远。

提前致谢。 戴夫。

3 个答案:

答案 0 :(得分:1)

在sed中使用循环:

sed -n '/^START DELETEME/{:l n; /^[ ]/bl};p' input

答案 1 :(得分:1)

GNU sed

sed '/LEAVEMEBE/,/DELETEME/!d;{/DELETEME/d}' file

答案 2 :(得分:0)

我会坚持使用awk:

awk '
/LEAVE|SOMETHING/{flag=1} 
/DELETE/{flag=0} 
flag' file

但如果你还是喜欢sed,这是另一种方式:

sed -n '
/LEAVE/,/DELETE/{
       /DELETE/b
        p
     }
' file