删除包含嵌套大括号的块

删除包含嵌套大括号的块

我的 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,则可以使用该模块(我建议您这样做!),但如果您想留在 shell 中:

crossplane parse将 nginx 配置文件转换为 JSON。crossplane build则相反。jq理解并能够编辑 JSON。所以,

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

相关内容