LoginSignup
5
1

More than 5 years have passed since last update.

大量の行を含む文書から該当する文字列を含む1行を消去する

Last updated at Posted at 2017-06-21

やりたいこと

大量の行数を含むファイルから該当する文字列を探して、その行を削除したい

どうやってやったか sed編

たとえばこんなファイルがあったとします。

file_A
さる:Monkey
ひつじ:Sheep
いぬ:Dog
ねこ:Cat
くじら:Whale
ラッコ:Sea otter
コアラ:Koala
ランドセル:school bag

'くじら'を含む行を消したい。

sedコマンドを実行
sed -i '/くじら/d' file_A

確認してみましょう

cat file_A
file_A
さる:Monkey
ひつじ:Sheep
いぬ:Dog
ねこ:Cat
ラッコ:Sea otter
コアラ:Koala
ランドセル:school bag

イイ感じ!!

他の方法をやってみた grep -V編

'さる'を含む行を消したい
grep -V 'さる' file_A

出力結果
ひつじ:Sheep
いぬ:Dog
ねこ:Cat
くじら:Whale
ラッコ:Sea otter
コアラ:Koala
ランドセル:school bag

イイ感じ!!
しかし、これはfile_Aが上書きされたのではなく、file_Aから'さる'を含む行を表示していないだけ

ってことは、grep -V 'さる' file_Aの出力結果をfile_Aに書き込めばよい!?

grep -V 'さる' file_Aの出力結果をfile_Aに書き込む!?

grep -V 'さる' file_A > file_A '
これをするとファイル(file_A)の中身消えます。

なぜだ。 ちなみにファイルの書き込み先が異なると成功する
grep -V 'さる' file_A > file_B

これだと、当然fileBに書きこめている。

yokuwakanne!

Algebra_nobu さんのおかげで理由がわかりました。 ありがとうございます。

grep -V 'さる' file_A > file_A

先に太字の部分が実行されます。 file_Aという空のファイルを作成します。
そのあとで
grep -V 'さる' file_A
が実行されます。 この時のfile_Aは先ほど作成したばかりのfile_Aです。つまり空です。
理解できてすっきりしました。

5
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1