【问题标题】:sed: Delete blank lines following line ending with a markersed:删除以标记结尾的行之后的空白行
【发布时间】:2011-10-12 21:43:56
【问题描述】:

如何使用 sed 做到这一点?

    Input:                         Expected output:
    1               |              1
    2 MARKER        |              2 MARKER
                    |              3 MARKER
                    |              4
                    |              
                    |              5 MARKER
                    |              6
                    |              
    3 MARKER        |              
                    |              7 MARKER
    4               |              8
                    |              9
    5 MARKER        |                      
    6               |               
                    |              
                    |              
    7 MARKER        |                      
                    |              
    8               |               
    9               |               

首先我尝试了这个:它不起作用,因为“# niether t or b work because d 导致脚本中断。”

/MARKER$/ {
#   i -- Line with MARKER
:my_branch
#   i -- in branch
    # write current patt space to output and read next line to pattern space
    n
    # if non blank goto EO script
    /^$/! b
    # if blank line delete it
    /^$/ d
    # loop back for more blank lines.
    t my_branch
    # niether t or b work because d causes the script to break.
    b my_branch
}

然后我尝试了这个,它几乎可以工作:((( - 它不会删除 3 和 4 之间的线,我认为这是因为在 2 的处理过程中消耗了 3,因此它的标记被遗漏了。

/MARKER$/ {
#       i -- Line with MARKER
:my_branch
#   i -- in branch
    N
    s/MARKER\n/MARKER/
    t my_branch
    # I added the following but it doesn't help..
    /MARKER$/ b my_branch
}

我尝试了 4-5 个其他版本,但没有一个有效。

我做这一切是因为我试图回答这个问题:replace two newlines to one in shell command line,所以我从http://sed.sourceforge.net/sed1line.txthttp://www.grymoire.com/Unix/Sed.html开始学习sed

IOW 我知道有使用 awk、perl 等的解决方案,但我只是想学习使用 sed。

谢谢。

【问题讨论】:

  • 我不明白您要创建的转换。为什么你的输出中仍然有空白行(只是为了学习?)你能告诉我们你试图实施的规则吗?否则非常好的帖子。感谢您包含您已经阅读并了解的内容!祝你好运。
  • 抱歉,这里没有看到推荐。也许您错过了在整个问题中包含标题。 :) 如果您注意到,以“MARKER”结尾的行前面的空白行将被删除。其他空行不宜删除。

标签: shell sed


【解决方案1】:

见下文,我认为这是您想要的:(它在我的带有 gnu sed 的 linux 机器上运行)

kent$  cat t
1         
2 MARKER  






3 MARKER  

4         

5 MARKER  
6         


7 MARKER  

8         
9         

kent$  sed -r ':a;N;s/(.*MARKER)\s+(\n.*)/\1\2/;ba;' t
1         
2 MARKER
3 MARKER
4         

5 MARKER
6         


7 MARKER
8         
9    

【讨论】:

  • 谢谢。这对大文件有用吗?看起来它会在写出任何内容之前在模式空间中加载/处理整个文件。无论如何都被接受为答案,因为它回答了我的问题。
  • 你可以生成一个“巨大”的文件,试一试。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多