お命頂だいっ!
こんにちは、リクームです。
sedコマンドとは文字列を全置換したり、行単位で抽出したり、いろいろなテキスト処理をすることができるコマンドです。
そんな便利なsedコマンドですがヒヤッとした経験があったので、記事に残しておこうと思います。
ちなみに、sedという名称は「Stream EDitor」の略称らしいです。
sedはgeditやvimのようにテキストファイルの内容を表示しながらリアルタイムで対話的に編集するのではなく、ファイルやパイプラインからの入力をコマンドラインのオプションで指定した指示に従いテキストを編集して出力します。
流れてくるテキストを編集するため、「ストリームエディタ」と呼ばれています。
sedコマンドの使い方
まず、sedコマンドの基本的な使い方です。
「aaa, bbb, ccc」と記載されている以下のようなテキストファイルがあるとします。
cat test.txt
aaa, bbb, ccc
「aaa」と記載されている箇所を「ddd」という文字列に置換したい!という場合、sedコマンドを用いることで簡単に置換することができます。
## s"/置換前文字列/置換後文字列/"
cat test.txt | sed -e s"/aaa/ddd/"
##「aaa」が「ddd」に置き換わる!!
ddd, bbb, ccc
パイプラインで入力情報を置換することで見事に文字列が置き換わりましたね!
sedで置換した結果をテキストファイルに出力
さきほどは結果をコンソール上に出力しただけでしたが、今度はtxtファイルに出力してみましょう。
##置換結果を/tmp/after_test.textに出力
cat test.txt | sed -e s"/aaa/ddd/" > /tmp/after_test.text
##結果を出力すると・・・
cat /tmp/after_test.text
##変わってる!
ddd, bbb, ccc
文字列が置き換わっていることが確認できました。
さぁここからが本題です。
先ほどは出力するファイルを別ファイルにして出力しました。
今度は同じファイルに対して出力してみましょう。
## >だけでは上書きできないため、>|で強制的に上書きする。
cat test.txt | sed -e s"/aaa/ddd/" >| test.txt
## 結果を出力。。。。ってあれ???
cat test.txt
catで結果を確認しようと思いましたが出てきませんね。。。
viコマンドで確認してみましょう。
消えた・・・・!?
え、なんでなんで???
なぜこんなことが起きてしまうのでしょうか。。。
今回のように一つのコマンド列で「ファイルを開く操作」と「ファイルに書き込む操作(同じファイルに対して)」を実行するとファイルが消失してしまうのです。。恐ろしや〜。。
※上書きの際はエラーが出る場合もあります。今回私が行なった操作で「>|」で強制的に上書きを実行しましたが、「>」だけだとエラーが発生します。今回はわざと事象を発生させたかったので強行しました。
sedコマンドに限った話ではないですが、テキストファイルを編集する際は必ず、バックアップを取っておきましょう。。
まとめ
- sedコマンドを用いることで文字列の置換が簡単に行える
- 編集するファイルと出力するファイルが同一の場合、出力結果が空になるので注意
- テキストファイルをいじるときは極力バックアップを取るように心がける