2010-12-27 3 views
1

私は、彼らはまた、barが含まれていない限りfooを含むものを除くすべての行を表示したいと思います。 Logically!(foo and (!bar)) === (!foo) or barなので、2つの別々の式を使用できます。このような種類の一致を1つのgrepまたはegrepとすることはできますか? -vは両方の式を否定するので、おそらくPerlの正規表現を使用することはできません。ダブル/ハーフ反転のegrep

以下の作品が、それはegrepで行うことができれば、コードを変換するためにはるかに少ない作業のようになります。

$ echo ' 
foo 
bar 
moofoo 
foobar 
barbar' | grep -Pv '^((?!bar).)*foo((?!bar).)*$' 

bar 
foobar 
barbar 

問題手元にはスピード(ギガバイトのデータのパターンを探している)です。これは行ごとに動作し、何のパイプが、これは高速である必要があります関与されていないので、awkをを使用して罰金の場合

+0

私の脳はちょうどそれを見て痛い。良い質問。あなたはなぜPerl正規表現の使用を制限されているのですか?あなたのegrepは-Pをサポートしていませんか? –

+0

@Dave G: 'egrep -P'は' pgrep'や 'grep -P'と同じですので、何も変更されません。 – l0b0

答えて

1

次は、所望の出力に

awk 'BEGIN {FS=" "}; 
      { 
       if ($0 ~ /(foo)/) 
       { 
        if ($0 ~ /(bar)/) 
        { 
         print $0 
        } 
       } 
       else 
       { 
        print $0 
       } 
      }' FileContainingText.txt 

を与えます。