2012-03-02 12 views
48

私はsedを初めて使用しています。この例では:sedは特定の文字列を含まない行を削除します

some text here 
blah blah 123 
another new line 
some other text as well 
another line 

私はどちらかの文字列「text」のまたは文字列「何とか」が含まれているものを除き、すべての行を削除したいので、私の出力ファイルは、次のようになります。

some text here 
blah blah 123 
some other text as well 

sedを使ってどのようにこれを行うことができますか?

+3

しなければならないが、それを行うことができます答えはsedですか? grepはこれを非常に簡単に行います。 – Tim

答えて

11

「テキスト」または「曖昧」(またはその両方)に一致する行のみを印刷する場合は、 'と'および 'または'の区別が重要です。

sed -n -e '/text/{p;n;}' -e '/blah/{p;n;}' your_data_file 

-nは、デフォルトでは印刷されません。最初のパターンは 'text'を検索し、一致していればそれを出力し、次の行にスキップします。 2番目のパターンは 'ああ'と同じです。 'n'がなければ 'textとblah'を含む行が2回印刷されます。私はちょうど-e '/blah/p'を使用することができましたが、対称性は、特に一致する単語のリストを拡張する必要がある場合は、より良いです。

sedのバージョンが拡張正規表現をサポートしている場合に(例えば、GNU sed-rで、ない)、その後、あなたはそれを簡略化することができます。これはあなたのために働くかもしれない

sed -r -n -e '/text|blah/p' your_data_file 
+3

sedが '-r'をサポートしていない場合、おそらく' {} 'もサポートしません。 'sed '/ text \ | blah /!d' file' –

+0

' {...} 'コマンドのグループ化はUNIX版' sed'の第7版です。私はあなたがそれが支持されていないバージョンをどのように遭遇するのだろうと思うことができません。 –

79

sed '/text\|blah/!d' file 
some text here 
blah blah 123 
some other text as well 
+0

ありがとう、それは動作します。 – user1246172

+1

たとえば、最後の列にしかテキストや語尾が表示されないように指定するにはどうすればよいですか? – discipulus

+2

@lovedynasty *行末に*がある場合は、 '$': ''/ text $ \ | blah $ /!d'' – Melebius

5

あなたは単に、awkを経由

$ awk '/blah|text/' file 
some text here 
blah blah 123 
some other text as well 
関連する問題