sedを使用した正規表現キャプチャグループコンテンツの置き換え

sedを使用した正規表現キャプチャグループコンテンツの置き換え

次の行を含む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

おすすめ記事