2011-10-12 76 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