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

複数行の質問を1行の質問に変換

-zGNU 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 / {
  }
}

関連情報