중첩된 중괄호가 포함된 블록 제거

중첩된 중괄호가 포함된 블록 제거

내 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

관련 정보