2013-01-02 26 views
1

美好的一天每個人,需要一個唯一的字符串從一個文件匹配,則刪除整個封裝的文本

我目前正在寫一個程序,將檢查特定唯一的字符串文件,然後刪除整個封裝文本如下:

define service{ 
    use      generic-service,srv-pnp 
    host_name    MEVIE.COM 
    service_description  NSClient++ Version 
    check_command   check_nt!CLIENTVERSION 
    } 

該文件中有很多define service { ... }的實例。所以我不能只搜索定義服務,我必須搜索唯一的字符串,然後刪除整個define service { ... }封裝。

例如:

  • 在文件中查找字符串 「NSClient ++版」 ...
  • 刪除一切內define service{ .... }
  • 刪除define service { .... }標籤爲好。

我真的很希望我的目標很明確。

我已經試過:sed -n '/NSClient+++ Version/{H;g;p};H' MEVIE.bak|tail -n5 > mevie.fil ..這一切都返回除了最後一個 '}'

+0

還能有'{}'裏面嵌套定義'service'? – nhahtdh

+0

@nhahtdh - 不,不會有嵌套{} – Afrojoe

+0

Google for「sed multi-line」 – alex

回答

0

以下是使用sed的一種方法。運行像:的script.sed

sed -f script.sed file 

內容:或者

:t 
/define service{/ , /}/ { 
    /}/! { 
     $! { 
      N; 
      bt 
     } 
    } 
    /NSClient++ Version/d; 
} 

,這裏是一個班輪:

sed ':t /define service{/ , /}/ { /}/! { $! { N; bt } }; /NSClient++ Version/d }' file 
0

有更短的解決方案,但我用來做什麼的這樣:

awk '/^define service/ { 
    if ($0 ~ "}") { 
    block=$0 
    } else { 
    block=$0 
    while (block !~ "}") { 
     getline nl 
     block=block "\n" nl  
    } 
    } 
    if (block !~ "NSClient\\+\\+ Version") { print block } 
}' INPUTFILE > OUTPUTFILE 

See here in action

  1. 上的每個出發(define...)線檢查,如果它含有},如果是這樣,保存行block
  2. 別人讀,直到與}下一行與行添加到block
  3. 最後檢查如果我們想用Perl打印出來
+0

以上各種輸入文件都會以各種方式失敗,未來將很難提升,全都由getline提供。請參閱http://awk.info/?tip/getline。它也不會在塊之間打印文件內容,並且在RE比較中不必要地使用字符串RE,因此需要兩次跳過「+」。 –

+0

謝謝@EdMorton你是對的。 –

2
awk ' 
/^define service{/ { inBlock = 1; block = "" } 

inBlock { 
    block = block $0 ORS 
    if (/}/) { 
     if (block !~ /NSClient\+\+ Version/) 
     printf "%s",block 
     inBlock = 0 
    } 
    next 
} 

{ print } 
' file 
+0

這是令人敬畏的Ed ..我會盡快嘗試。讓你在循環 – Afrojoe

+0

謝謝你們......這一切都完美無缺! – Afrojoe

0

方式一:

perl -0pe 's/define service[ \t]*\{[^{}]*?NSClient\+\+[ \t]+Version[^{}]*?\}//gs' filename 
相關問題