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

答え2

\No.正規表現でこれが何であるかを知る必要があります。逆参照括弧内のパターン()。したがって、正規表現は次のようになります。's@^(\s*access_log ).*$@\1/dev/stdout/;@'

私は提供できる

sed '/access_log/s|/[^;]\+|/dev/stdout|'

/ヒント:パターン内で使用するかどうかに関係なく、任意のs///シンボルを自由に変更できます。s###

答え3

キャプチャするのではなく、ただ見つけて交換したらどうでしょうか?つまり:

sed "/access_log/ s| /.*;| /dev/stdout;|"

""と一致する行を検索し、access_log一致する行で " "/whatever/path/is/there;を " /dev/stdout;"に置き換えます。

関連情報