次の行を追加したい
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
複数行の質問を1行の質問に変換
-z
GNU sedは、sedが考慮する行を選択するオプションを提供します。
一般的な見解は、ファイルが各改行文字の後に複数行に分割されることです。対照的に、この-z
オプションを使用すると、sedはその行をNULLバイトで終了すると見なします。
sed -z
各ファイルには1つの長い行しか表示されない可能性があります。幸いなことに、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 / {
}
}