如何在替换过程中忽略 sed 中的开头空格?

如何在替换过程中忽略 sed 中的开头空格?

我想在模式搜索和替换期间忽略文件中的开头空格。最终输出不需要有空格。我必须匹配整条线并替换为所需的线。尝试了不同的方法,但由于空格不匹配,替换没有发生。

输入文件.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

相关内容