我的 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