4

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

样本输入:

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”行仍然存在(是的,我可以将其 grep 出来,但这很难看 :) 而且 - 它也删除了此示例中的空行,如果它们是,我想留下空行我的结束模式完好无损)我想知道是否有办法用一个 sed 命令来做到这一点。我有一个很好的 awk 脚本:

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

                if (flag != 1)
                        print $0
        }

但正如您所知,“A 代表 awk,它像蜗牛一样奔跑”。它需要永远。

提前致谢。戴夫。

4

3 回答 3

1

GNU sed

sed '/LEAVEMEBE/,/DELETEME/!d;{/DELETEME/d}' file
于 2013-06-13T07:57:34.753 回答
1

在 sed 中使用循环:

sed -n '/^START DELETEME/{:l n; /^[ ]/bl};p' input
于 2013-06-13T07:53:27.213 回答
0

我会坚持使用 awk:

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

但如果你仍然更喜欢 sed,这里有另一种方式:

sed -n '
/LEAVE/,/DELETE/{
       /DELETE/b
        p
     }
' file
于 2013-06-13T08:53:31.990 回答