ネストされた中かっこを含むブロックを削除する

ネストされた中かっこを含むブロックを削除する

私のNGINX設定ファイルに次のブロックがあります

server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /web/default/wwwroot/;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }

ブロック全体を削除したいです。次のsed / regexコマンドを試しました。

sed -ri '/server,/.*\}/d' /etc/nginx/nginx.conf

ただし、見つかった最初の閉じた括弧を削除してセクションを残します。

   error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }

一致する閉じ括弧と一致させ、ブロック全体を削除するにはどうすればよいですか?

ありがとうございます。

答え1

アドレスを使用して、パターン1とパターン2の間のすべての行を一致させることができますsed '/pattern1/,/pattern2/'

あなたの場合、次から始まる行からserver {始まる行まですべてを削除すると、}次のように書かれます。

sed '/^server {/,/^    }/d' file

答え2

私が知る限り、nginxの設定は一般的な言語ではありません。正規表現を使用して解析する保証はないため、まったく選択のツールではない可能sed性があります。あなたの例ですべてのケースで動作するようにするには、{コメント、文字列、グローバル変数ではなく開始をカウントします}server {

ぼやけた絵の答えはあなたのためですはい、インデントに頼ることができるからです。各ファイルの内容がまったく同じであることを保証できますか?そうでない場合は、気付かずにサーバーを誤って設定したいと思いますか?

nginx設定言語を実際に「理解」し、解析し、結果を修正するためのツールを使用することをお勧めします。

Nginx会社は独自crossplane今すぐ正確にそのような目的のために。 Pythonを知っている場合はモジュールを使用できますが(使用することをお勧めします)、シェルに滞在したい場合は次のようにします。

crossplane parsenginx設定ファイルをJSONに変換します。crossplane buildその逆は本当です。jqJSONを理解して編集できます。だから、

crossplane parse /etc/nginx/nginx.conf | \
  jq 'jq commands that do exactly what you want | \
    crossplane build --stdout - > newconfig.conf

関連情報