交換中に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

おすすめ記事