sedでファイルを上書き保存するには-iオプションを使う
最初に正解から。sedコマンドで読み込んだファイルを編集して同じファイルに上書きするには次のように-iオプションを使う。
$ sed -i 's/hoge/foo/g' infile
これでinfileから読み込んで、sedで処理した結果をinfileに上書き保存する。
よくある間違いは読み込んだファイルにリダイレクトして上書きしようとすることだ。
$ sed 's/hoge/hoo/g' infile > infile
これだとファイルが空になってしまう。
もちろん読み込んだファイルとは異なるファイルへリダイレクトすることは正しい処理だ。
$ sed 's/hoge/hoo/g' infile > otherfile
-iの後に(間にスペースを挟まないで)拡張子の文字列を追加すると、その拡張子をサフィックスとして変更前のバックアップを取ることがでる。
$ sed -i'.orig' 's/hoge/foo/g' infile $ ls infile* infile infile.orig
ちなみに、この-iオプションは日本語のmanページには(内容が古いせいか)載っていないことがある。そのが場合は英語のmanページを見る必要がある。日本語環境で英語のmanページを表示させるには次のように実行する。
$ LANG=C man sed
これはLANG環境変数にCを設定してからコマンド(ここではman)を実行する。LANGへの設定は後続のコマンドの実行時だけ有効になる。日本語のmanページをみて-iオプションは使えないと早合点をしないようにしよう。
最後までお読みいただきありがとうございます。