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


16

私は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 '/access_log/s|/[^;]\+|/dev/stdout|'
コスタス14年

@Costasあなたがそれを答えにするなら、それもうまくいくので私はあなたに賛成します!
安倍Voelker 14年

回答:


16

そこにいくつかの間違いがあります。

まず、sed基本的な正規表現を使用するため、キャプチャグループを作成する必要が\(あります\)。この-rスイッチは拡張正規表現を有効にするため、エラーは発生しません。なぜ正規表現文字として解釈されるためにsedで正規表現文字をエスケープする必要があるを参照してください

次に、キャプチャグループを間違った場所に配置しています。私があなたを正しく理解していれば、これを行うことができます:

sed -e 's!^\(\s*access_log\)[^;]*;!\1 /dev/stdout;!' your_file

の使用に注意してください !スラッシュをエスケープする必要がないよう、正規表現区切り文字として/dev/stdout


ありがとう、素晴らしく動作します!これをまだ承認済みとしてマークすることはできませんが、そうするために9分後に戻ります。
安倍Voelker 14年

1
@AbeVoelkerどういたしまして。お手伝いできてうれしいです。
ジョセフR. 14年

5

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

提供できます

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

ヒント:かどうかは、あなたが使用する/あなたが変更に自由に摂餌の内側にs///あなたが好きなすべてのシンボルのためにs###例えば


ありがとう、私は2つの答えを受け入れられることを望みます!ソリューションを見た後、助けを求める前にマニュアルページを完全に読んでいないことを後悔していません。
安倍Voelker 14年

3

キャプチャするのではなく、単に見つけて置換を実行してみませんか?すなわち:

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

access_log」に一致する行を検索し、それを実行する行で「/whatever/path/is/there;」を「/dev/stdout;」に置き換えます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.