##やりたいこと
大量の行数を含むファイルから該当する文字列を探して、その行を削除したい
##どうやってやったか sed編
たとえばこんなファイルがあったとします。
さる:Monkey
ひつじ:Sheep
いぬ:Dog
ねこ:Cat
くじら:Whale
ラッコ:Sea otter
コアラ:Koala
ランドセル:school bag
'くじら'
を含む行を消したい。
sedコマンドを実行
sed -i '/くじら/d' file_A
確認してみましょう
#####cat 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です。つまり空です。
理解できてすっきりしました。