내 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 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