다음 줄을 추가하고 싶습니다
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 구현은 이러한 여러 줄 문제를 단순화하는 확장 기능을 제공합니다.
하지만 이 경우 가장 유용한 도구는 -z
GNU sed에서 제공하는 옵션으로, 아래에서 이를 최대한 활용합니다.
다음을 실행하여 sed 버전이 GNU 구현인지 확인할 수 있습니다.
sed --version
여러 줄 질문을 한 줄 질문으로 변환
-z
GNU 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 / {
}
}