Linux
shell
Linuxコマンド

sedコマンドの怖〜い体験


お命頂だいっ!

こんにちは、リクームです。

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コマンドで確認してみましょう。

スクリーンショット 2019-02-10 3.20.03.png

消えた・・・・!?

え、なんでなんで???

なぜこんなことが起きてしまうのでしょうか。。。

今回のように一つのコマンド列で「ファイルを開く操作」と「ファイルに書き込む操作(同じファイルに対して)」を実行するとファイルが消失してしまうのです。。恐ろしや〜。。

※上書きの際はエラーが出る場合もあります。今回私が行なった操作で「>|」で強制的に上書きを実行しましたが、「>」だけだとエラーが発生します。今回はわざと事象を発生させたかったので強行しました。

sedコマンドに限った話ではないですが、テキストファイルを編集する際は必ず、バックアップを取っておきましょう。。


まとめ


  • sedコマンドを用いることで文字列の置換が簡単に行える

  • 編集するファイルと出力するファイルが同一の場合、出力結果が空になるので注意

  • テキストファイルをいじるときは極力バックアップを取るように心がける