次の行を含むnginx.confファイルをプログラムで編集しようとしています。
access_log /var/log/nginx/access.log;
私はそれが次のように見えるようにしたいです:
access_log /dev/stdout;
私は正規表現を信じています^\s*access_log([^;]*);
キャプチャグループの一部をキャプチャし/var/log/nginx/access.log
ますが、キャプチャグループをsedに正しく置き換える方法がわかりません。
頑張った
echo " access_log /var/log/nginx/access.log;" | sed 's/^\s*access_log([^;]*);/\1\\\/dev\\\/stdout/'
しかし、エラーが発生します。
sed: -e expression #1, char 45: invalid reference \1 on `s' command's RHS
試してもsed -r
エラーは表示されませんが、出力は期待したものとは異なります。
/var/log/nginx/access.log\/dev\/stdout
デプロイ時にデフォルトのログファイルの場所が変更された場合は、「access_log /var/log/nginx/access.log;」を直接検索するのではなく、グループキャプチャなどの作業に賢明に取り組んでいます。
ベストアンサー1
これにはいくつかのエラーがあります。
まず、デフォルトsed
の正規表現を使用しているので、キャプチャグループを作成する必要が\(
あります。\)
この-r
スイッチを使用すると、拡張正規表現を使用できるため、エラーは発生しません。バラより正規表現文字を正規表現文字として解釈するためにsedで正規表現文字をエスケープする必要があるのはなぜですか?。
第二に、キャプチャグループを間違った位置に配置した。私が正しく理解したら、次のようにすることができます。
sed -e 's!^\(\s*access_log\)[^;]*;!\1 /dev/stdout;!' your_file
!
スラッシュをエスケープしない場合は、正規表現の区切り文字としてを使用することに注意してください/dev/stdout
。