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