質問: **現象** sedコマンドの条件式にスペースを入力しても、うまく置換できない。 **期待値** sedコマンドの条件式にスペースを挿入した状態で置換をしたい。 具体的には、`/etc/logrotate.d/clamav-freshclam`の`create 640 clamav adm`を`create 640 clamav clamav`に置換したい。 **再現手順** 下記のShellScriptを実行する。 ``` #!/bin/bash ...省略 #ClamAV #インストールする apt install clamav clamav-daemon #ログファイルの削除 rm /var/log/clamav/freshclam.log #ログファイルを再生成する touch /var/log/clamav/freshclam.log #freshclam.logのユーザー所有権とグループ所有権の変更 chown clamav:clamav /var/log/clamav/freshclam.log #ログロテートの設定の変更 sed -e "7s/create 640 clamav adm/create 640 clamav clamav/g" /etc/logrotate.d/clamav-freshclam ``` 参考リンクは下記です。 【Ubuntu 20.04/18.04 LTS Server】ClamAVで定期的にウイルスチェックし、メール通知する
回答: 質問に書かれた sed のパターンには正規表現が含まれておらず "単純な文字列" なので、完全に一致した場合にしかマッチしたと判定されず、コメントで指摘のある通り空白文字の数が少し違うだけ等の場合にうまく動かないでしょう。 今回の場合であればもっとパターン部分を単純にして「行の末尾にある "adm" を "clamav" に置換」で良さそうです。(パターン部の `$` が末尾を表します) ``` $ sed -e 's/adm$/clamav/' /etc/logrotate.d/clamav-update ``` 補足として、上記の通りパターンを変えたとしても sed の実行結果は標準出力に表示されるだけなので、元のファイルは書き換わりません。 元の入力ファイルに結果を上書きするには、`-i` オプションを使います。 ``` $ sed -i -e 's/.../.../' input-file ``` 念のため元のファイルのバックアップをとっておきたい場合には、`-i` オプションにバックアップファイルに付ける拡張子を指定します。 ``` $ sed -i.bak -e 's/.../.../' input-file ```