Shell-Script

如何在替換期間忽略 sed 中的起始空格?

  • October 19, 2021

我想在模式搜尋和替換期間忽略文件中的開頭空格。最終輸出不需要有空格。我必須匹配整行並替換為所需的行。嘗試了不同的方法,但由於空格不匹配,因此沒有發生替換。

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

請讓我知道如何實現這一目標。提前致謝。

您必須對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

引用自:https://unix.stackexchange.com/questions/673841