GNU sed 사용

GNU sed 사용

다음 줄을 추가하고 싶습니다

if ($http_user_agent ~* "somewebsite" ) {
    return 444;
} 

NGINX의 모든 가상 호스트는 다음과 같습니다

server {
  location / {
    want_to_add_those_3_lines_here
  }
}

어떤 아이디어가 있나요?

답변1

GNU sed 사용

이 작업은 sed를 사용하여 수행할 수 있습니다.

그러나 sed의 POSIX 표준으로 제한되어 있는 경우 삽입이 필요한지 여부를 결정하려면 해당 패턴과 여러 줄을 비교해야 하기 때문에 이 문제를 처리하는 것이 그리 쉽지 않습니다.

sed의 GNU 구현은 이러한 여러 줄 문제를 단순화하는 확장 기능을 제공합니다.

하지만 이 경우 가장 유용한 도구는 -zGNU sed에서 제공하는 옵션으로, 아래에서 이를 최대한 활용합니다.

다음을 실행하여 sed 버전이 GNU 구현인지 확인할 수 있습니다.

sed --version

여러 줄 질문을 한 줄 질문으로 변환

-zGNU sed는 sed가 고려하는 행을 선택할 수 있는 옵션을 제공합니다 .

일반적인 견해는 파일이 각 개행 문자 다음에 여러 줄로 분할된다는 것입니다. 대조적으로, 이 -z옵션을 사용하면 sed는 해당 행을 NULL 바이트로 종료되는 것으로 간주합니다.

sed -z각 파일에는 하나의 긴 줄만 표시될 가능성이 높습니다. 다행스럽게도 GNU sed는 처리할 수 있는 줄 길이에 제한을 두지 않습니다.

해결책

sed-script다음 스크립트 이름을 선택합니다 .

#!/bin/bash

pattern="\
\(\
server {\n\
  location / {\n\
\)\(\
  }\n\
}\)\
"

replacement="\
    if (\$http_user_agent ~* \"somewebsite\" ) {\n\
        return 444;\n\
    }\n\
"

sed -z -e 's!'"$pattern"'!\1'"$replacement"'\2!g' "$1" > "$2"

스크립트를 실행 가능하게 만들고 다음과 같이 호출하면:

./sed-script INFILE OUTFILE

INFILE모든 발생을 찾는 것을 처리합니다 .

server {
  location / {
  }
}

그것을로 바꾸십시오

server {
  location / {
    if ($http_user_agent ~* "somewebsite" ) {
        return 444;
    }
  }
}

그리고 그 결과를 에 넣습니다 OUTFILE.

여기서 스크립트를 사용하는 유일한 이유는 sed 명령의 구조를 명확하게 유지하기 위해서입니다.

검색 패턴에는 슬래시( /)가 포함되어 있으므로 느낌표( !)를 사용하여 sed 명령의 필드를 구분합니다.

답변2

sed를 사용한 최신 답변은 다음과 같습니다.

$ sed '/location/ r addy' nginx 
server {
  location / {
if ($http_user_agent ~* "somewebsite" ) {
    return 444;
} 
  }
}

어디:

$ cat addy 
if ($http_user_agent ~* "somewebsite" ) {
    return 444;
} 

$ cat nginx 
server {
  location / {
  }
}

관련 정보