2011-10-12 130 views
1

如何使用sedsed:删除以标记结尾的空白行

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工作,因为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之间的线路,我认为这是因为3的2的处理过程中被消耗,因此它的标记错过

/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.txt sed和http://www.grymoire.com/Unix/Sed.html

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

谢谢。

+0

我不明白你正在试图创造的转型。为什么在输出中仍然留有空行(仅供学习?)您能告诉我们您正在尝试实施的规则吗?否则非常好发布。感谢您列入您已经阅读并知道的内容!祝你好运。 – shellter

+0

对不起,没有看到那里的表扬。也许你错过了整个问题的标题。 :)如果您注意到,以“MARKER”结尾的行前面的空行将被删除。其他空白行不应被删除。 – Kashyap

回答

1

看到下面,我想这是你想要什么:(它跑在我的GNU Linux机器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  
+0

谢谢。这会对大文件起作用吗?它看起来会在写出任何内容之前在模式空间中加载/处理整个文件。无论如何都被接受为答案,因为它回答了我的问题。 – Kashyap

+0

你可以生成一个“巨大”的文件,并试一试。 ;) – Kent