web-dev-qa-db-ja.com

「x」を含むが「y」を含まないUnix grep正規表現

私は、たとえばアルファを含むがベータを含まないUnix grep用のシングルパス正規表現が必要です。

grep 'alpha' <> | grep -v 'beta'
47
Wilderness

^((?!beta).)*alpha((?!beta).)*$は私が思うトリックをするでしょう。

19
Mr47

ここでの他の回答は、これを行うためにさまざまな正規表現をゆがめることができるいくつかの方法を示していますが、答えは一般的に「それをしないでください」であることが判明したと思います。このような正規表現は、使用している言語のブールロジックを使用して2つの正規表現を組み合わせた場合よりも読みにくく、おそらく実行に時間がかかります。 UNIXシェルプロンプトでgrepコマンドを使用している場合は、一方の結果を他方にパイプするだけです。

grep "alpha" | grep -v "beta"

grepからの過剰な結果を選別するために、この種の構造を常に使用しています。 2番目のコマンドは入力全体ではなく、最初の出力のみを処理すればよいため、どの結果セットが小さくなるかがわかっている場合は、その結果セットを最初にパイプラインに配置して、最高のパフォーマンスを得ます。

41
nohat

答えを投稿しているので、ここではawkです;-)

awk '/x/ && !/y/' infile

これがお役に立てば幸いです。

29
shellter

これは真の正規表現では不可能だと確信しています。 [^y]*x[^y]*の例はyxyに一致します。*は0個以上の非yの一致を許可するためです。

編集:

実際、これはうまくいくようです:^[^y]*x[^y]*$。基本的には、「ゼロ以上の非y文字で始まり、xがあり、ゼロ以上の非y文字で終わる行に一致する」ことを意味します。

3
Shea Levy

Excludes演算子を使用してみてください:[^y]*x[^y]*

0
sblundy