2016-07-09 2 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 

파일 CONTENT

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 regexp도 마찬가지지만 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 
관련 문제