パターンの検索と置換中にファイルの先行スペースを無視したいと思います。最終出力にはスペースは必要ありません。ライン全体を合わせて目的のラインに交換する必要があります。別の方法を試しましたが、スペースが一致しないため、交換は発生しません。
入力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