sed:删除以标记结尾的行后面的空白行

时间:2011-10-12 21:43:56

标签: shell sed

如何使用 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或b work,因为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,因此错过了它的标记。 / p>

/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

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

感谢。

1 个答案:

答案 0 :(得分:1)

见下文,我认为这是你想要的:(它在我的linux盒子上用gnu sed运行)

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