교체 중에 sed의 선행 공백을 무시하는 방법은 무엇입니까?

교체 중에 sed의 선행 공백을 무시하는 방법은 무엇입니까?

패턴 검색 및 교체 중에 파일의 선행 공백을 무시하고 싶습니다. 최종 출력에는 공백이 필요하지 않습니다. 전체 라인을 맞춰서 원하는 라인으로 교체해야 합니다. 다른 방법을 시도했지만 공백이 일치하지 않아 교체가 발생하지 않습니다.

입력 file.txt:

Access /var/tmp/access.log  
    LogFormat "%h \"%r\" %>s %b\" common  
Error /var/tmp/err.log

예상되는 file.txt:

Access /var/tmp/access.log  
    LogFormat "%T %h \"%r\" %>s %b" common    
Error /var/tmp/error.log 

아래는 내가 시도한 것입니다. 그러나 그 중 아무것도 작동하지 않습니다. 파일은 변경되지 않은 상태로 유지됩니다.

source1="LogFormat \"%h \\"%r\\" %>s %b\" common"
destination1="LogFormat \"%T %h \\"%r\\" %>s %b\" common"
sed -i "s|$source1|$destination1|" file.txt
sed -i "s|^(\s*)$source1|$destination1|" file.txt
sed -i "s|^\s*$source1|$destination1|" file.txt
sed -i "s|^[[:blank:]]$source1|$destination1|" file.txt
sed -i "s|^[[:blank:]]*$source1|$destination1|" file.txt

이를 달성하는 방법을 알려주십시오. 미리 감사드립니다.

답변1

source1변수를 이중 이스케이프하고 작은따옴표를 사용해야 합니다 .

$ source1='LogFormat \\\"%h \\\\"%r\\\\" %>s %b\\\" common'
$ sed "s|$source1|$destination1|" file
Access /var/tmp/access.log  
    LogFormat "%T %h \"%r\" %>s %b" common  
Error /var/tmp/err.log

사용 \s(GNU에서 sed):

$ sed "s|^\s*$source1|$destination1|" file 
Access /var/tmp/access.log  
LogFormat "%T %h \"%r\" %>s %b" common
Error /var/tmp/err.log

관련 정보