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だけを検索することはできません。一意の文字列を検索してから、define service { ... }カプセル化全体を削除する必要があります。

例えば:

  • ファイルで文字列「NSClient++Version」を見つけます...
  • 内のすべてを削除しますdefine service{ .... }
  • define service { .... }タグも削除します。

私の目標が明確であることを本当に望んでいます。

私が試しました:sed -n '/NSClient+++ Version/{H;g;p};H' MEVIE.bak|tail -n5 > mevie.fil..最後の'}'を除くすべてを返します

4

4 に答える 4

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
于 2013-01-02T19:37:22.450 に答える
0

perlの1つの方法:

perl -0pe 's/define service[ \t]*\{[^{}]*?NSClient\+\+[ \t]+Version[^{}]*?\}//gs' filename
于 2013-01-02T19:47:59.193 に答える
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

ここでの動作を参照してください

  1. すべての開始(define...)行で、が含まれているかどうかを確認し、含まれている場合は}、その行を次のように保存します。block
  2. それ以外の場合は、次の行まで読み取り、次の行を}追加しますblock
  3. 最後に、印刷するかどうかを確認します
于 2013-01-02T19:21:00.173 に答える
0

これがを使用する1つの方法sedです。次のように実行します:

sed -f script.sed file

内容script.sed

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

または、これがワンライナーです。

sed ':t /define service{/ , /}/ { /}/! { $! { N; bt } }; /NSClient++ Version/d }' file
于 2013-01-03T00:58:35.133 に答える