2016-06-07 60 views
4

刪除我想刪除模式的所有多OCCURENCES像SED多用模式

{START-TAG 
    foo bar 
    ID: 111 
    foo bar 
    END-TAG} 

    {START-TAG 
    foo bar 
    ID: 222 
    foo bar 
    END-TAG} 

    {START-TAG 
    foo bar 
    ID: 333 
    foo bar 
    END-TAG} 

我想刪除START-TAG和包含特定的ID結束標籤之間的所有部分。

所以刪除ID:222只,這將依然存在:

{START-TAG 
    foo bar 2 
    ID: 111 
    foo bar 3 
    END-TAG} 


    {START-TAG 
    foo bar 2 
    ID: 333 
    foo bar 3 
    END-TAG} 

我應該刪除ID的黑名單。

我假設一個非常簡單的多行sed正則表達式腳本會這樣做。誰能幫忙?

這與問題:sed multiline replace非常相似,但不完全相同。

+0

很難用'sed',因爲'ID'是在節中段被刪除。使用'awk'更容易。 –

+0

@MichaelVehrs不太困難'sed'/ {START-TAG/{:1;/END-TAG} /!{N; b1};/ID:* 222/d}''? – 123

+1

@ 123當然是意見的問題。我發現'sed'分支太滑無法處理。而且它肯定比'awk -v RS =「」'!/ ID:222 /''更困難。 –

回答

6

您可以使用以下方法:

sed '/{START-TAG/{:a;N;/END-TAG}/!ba};/ID: 222/d' data.txt 

擊穿:

/{START-TAG/ { # Match '{START-TAG' 
:a    # Create label a 
N    # Read next line into pattern space 
/END-TAG}/! # If not matching 'END-TAG}'... 
      ba # Then goto a 
}    # End /{START-TAG/ block 
/ID: 222/d  # If pattern space matched 'ID: 222' then delete it. 
+0

太好了,太快了。我愛SO :-) – Bastl

+0

ID列表如何?這有一個共同的sed技巧嗎?或者我會使用bash-for循環?啊。,, sed -F帶有這樣的模式/命令列表? – Bastl

+2

用這樣的東西替換最後一行:'/ ID:\(a \ | b \ | c \)/ d'。其中'a','b'和'c'是你想要刪除的ID。 – andlrc