2016-06-29 4 views
0

sedを使用してdhcp設定ファイルからブロックを削除してもらえますか?私は回路-idで一致したホストのためのブロックを削除する必要がありsed delete block

host dev1 { 
    host-identifier option agent.circuit-id "test1:418"; 
    fixed-address xxx.xxx.xxx.xxx; 
    option routers xxx.xxx.xxx.xxx; 
    option subnet-mask xxx.xxx.xxx.xxx; 
} 
host host2{ 
    host-identifier option agent.circuit-id "test2-:5"; 
    fixed-address xxx.xxx.xxx.xxx; 
    option routers xxx.xxx.xxx.xxx; 
    option subnet-mask xxx.xxx.xxx.xxx; 
} 

: ファイルは次のようになります。

sed -e '/^host\s*\S*\s*{\s*/ { N; /\s*test1:418/ { N; /[^host]/ { N; /[^host]/ { N; /[^host]/ { N; /[^host]/d}}}}}' -e '/^$/d' /path/to/file 

しかし、それは...全く許容いないようです:(

+0

'[^ host]'は 'h'、' o'、 's'、' t'以外の一文字にマッチします。あなたのサンプルのすべての行には、少なくとも1つの文字が含まれています。したがって、すべての行はこの条件に一致します。 – tripleee

+1

多くの 'sed'方言も' \ s'などのPerl拡張をサポートしていません – tripleee

答えて

1

これは私が強く設定を変更するためにomshellを使用することをお勧めしますISC DHCPサーバの場合

:私はコマンドでそれをやりました。

あなたはGNU gawkがあればそうでない場合は、以下のgawkコマンドを実行するには十分かもしれません:

gawk '!/test2-:5/' RS='}\n' ORS='}\n' file 
      ^----------------------------------- ID goes here 

コマンドはリミですGNU gawkには、複数の行レコードセパレータを使用しています。

説明:

レコードセパレータとして}\nを使用して、awkはブロックの代わりに、デフォルトの行単位モードでファイルのブロックを処理します。私たちは、正規表現!/test2-:5/を適用し、それらのレコードで

host dev1 { 
    host-identifier option agent.circuit-id "test1:418"; 
    fixed-address xxx.xxx.xxx.xxx; 
    option routers xxx.xxx.xxx.xxx; 
    option subnet-mask xxx.xxx.xxx.xxx; 

host host2{ 
    host-identifier option agent.circuit-id "test2-:5"; 
    fixed-address xxx.xxx.xxx.xxx; 
    option routers xxx.xxx.xxx.xxx; 
    option subnet-mask xxx.xxx.xxx.xxx; 

:awkを意味することは、これらのレコードが表示されます。正面の!がマッチを否定します。条件がtrueと評価された場合、awkはデフォルトで現在のレコードを出力するので、moreを指定する必要はありません。 2番目のレコードはパターンに一致するため、印刷されません。

出力レコードセパレータの場合も、印刷時に閉じ括弧が追加されます。


ところで、sedと私はラベル(:a)に基づいてループを使用します。 /host .*{/から始まり、終了コード}まで入力をスラーリングし、すべての行をパターンバッファに追加します。閉鎖}に到達すると、パターンバッファにIDが含まれているかどうかを確認します。もしそれがidを含んでいれば削除されます:

sed '/host .*{/{:a;N;/}/!ba;/test2-:5/d}' file 
+0

あなたは100%正しいですが、これはsedの仕事ではありません。複数の文字 'RS'のためにgawk固有のことを言及するか、'} 'の後に' \ n'をなくしてください。 –

+1

私はあまりにもうまくやっている!ありがとう。 Btw、私は昨日の議論に基づいて私の気持ちをまもなく 'BEGIN {RS = ORS =" \ n} "}/test2-:5/''に変更しましたが、 'BEGIN'ブロックはOPを混乱させるかもしれません。コマンドの長さがこのような問題ではない場合、私は個人的にはこれから優先します。 – hek2mgl

+0

ありがとうございます。あなたは正しい、それはsedのためではないが、私はsedによってそれをしなければならない。理由は問いません:)あなたの答えはまったく問題ありません。 –