2016-07-09 21 views
0

特定の文字列を見つけようとしていますが、sedコマンドで置き換えようとしていますが、コマンドを実行しても何も起きていないようです。異なる文字列の文字列をSEDコマンドで置き換える

FIND:

LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined 

に置き換える:

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 

ファイルコンテンツ

hello 
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined 
bye 

COMMAND

$ sed -i 's/LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined/LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined/g' /etc/apache2/apache2.conf 

私はHow do I escape double and single quotes in SED? (bash)に見えたが、問題が何であるかをトレーニングすることはできません。

答えて

1

ファイルに引用符を付ける前にバックスラッシュが含まれています。あなたのsed正規表現も同様ですが、sedの場合はリテラルが必要なときにエスケープ文字になります。あなたはそれらをリテラルにするためにバックスラッシュをエスケープする必要があり、例えば:

...\\"%r\\".. 

参照:

$ sed 's/LogFormat "%h %l %u %t \\"%r\\" %>s %O \\"%{Referer}i\\" \\"%{User-Agent}i\\"" combined/LogFormat "%{X-Forwarded-For}i %l %u %t \\"%r\\" %>s %b \\"%{Referer}i\\" \\"%{User-Agent}i\\"" combined/g' file 
hello 
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 
bye 

が、代わりにすべてのテキストをキャプチャグループを使用して、代わりに複製考える:

$ sed 's/\(LogFormat "\)%h\(%l %u %t \\"%r\\" %>s %\)O\(\\"%{Referer}i\\" \\"%{User-Agent}i\\"" combined\)/\1%{X-Forwarded-For}i\2b\3/g' file 
hello 
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 
bye 
関連する問題