【问题标题】:sed: remove strings between two patterns leaving the 2nd pattern intact (half inclusive)sed:删除两个模式之间的字符串,使第二个模式保持不变(包括一半)
【发布时间】:2013-06-13 06:43:34
【问题描述】:

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

示例输入:

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”。这需要很长时间。

提前致谢。 戴夫。

【问题讨论】:

    标签: regex filter sed awk


    【解决方案1】:

    在 sed 中使用循环:

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

    【讨论】:

    • 谢谢。我对busybox sed(现在已修复)有一个小语法错误 - 但是:当有多个“START DELETME”一个接一个时它似乎不起作用(即 - 当下一个结束 ^[^ ]部分开始,如果它是另一个“START DELETME”部分 - 它将保留在那里......任何帮助将不胜感激!
    【解决方案2】:

    GNU sed

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

    【讨论】:

      【解决方案3】:

      我会坚持使用 awk:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-15
        相关资源
        最近更新 更多