sedコマンドの出力はオプションがない場合、通常、標準出力に出力されます。
1 2 3 |
$ echo 'sed test' | sed '1itext' text sed test |
sedコマンドでファイルに対して、直接編集を行いたい場合はGNU拡張で-i(--in-place)オプションがあります。
以下のようなinputfileを作成してから
inputfile
1 2 3 |
aaa bbb ccc |
-iオプションを利用すると
1 2 3 4 5 |
$ sed -i 's/bbb/ddd/' inputfile $ cat inputfile aaa ddd ccc |
ファイルを直接編集することができます。
-iオプションを利用しない場合は、一度テンポラリファイルにsedコマンドの出力を保存し、ファイルを置き換えることでファイルを直接編集することと同じような結果を得られるでしょう。
1 2 3 4 5 6 |
$ sed 's/bbb/ddd/' inputfile > tmpfile $ mv tmpfile inputfile $ cat inputfile aaa ddd ccc |
バックアップファイルを作成
sedコマンドで-iオプションのみでファイルを編集すると意図しない結果でもファイルを上書きしてしまう可能性があります。
そのような結果を防ぎたい場合は、-iオプションの引数としてファイルの接尾辞として文字列を渡すと、その接尾辞を追加したバックアップファイルが作成されます。
1 2 3 4 5 6 7 8 9 |
$ sed -i.bak 's/bbb/ddd/' inputfile $ cat inputfile aaa ddd ccc $ cat inputfile.bak aaa bbb ccc |
ロングオプションだと以下のように指定します。
1 |
$ sed --in-place=.bak 's/bbb/ddd/' inputfile |
-iオプションを利用しない場合は、編集したいファイルのコピーをしてバックアップファイルを作成すればよいでしょう。
1 2 3 4 5 6 7 8 9 10 11 |
$ cp inputfile inputfile.bak $ sed 's/bbb/ddd/' inputfile > tmpfile $ mv tmpfile inputfile $ cat inputfile aaa ddd ccc $ cat inputfile.bak aaa bbb ccc |