我想在模式搜索和替换期间忽略文件中的开头空格。最终输出不需要有空格。我必须匹配整条线并替换为所需的线。尝试了不同的方法,但由于空格不匹配,替换没有发生。
输入文件.txt:
Access /var/tmp/access.log
LogFormat "%h \"%r\" %>s %b\" common
Error /var/tmp/err.log
预期的文件.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