grep+regex のヘルプが必要

grep+regex のヘルプが必要

私は、2つの連続したeと2つのyを含む単語のセット(もしあれば)を見つけようとしています。しかし、これまでのところ、次のコマンドを試しました。

grep -e '[y&y].*[ee]' -e '[y&y].*[ee]' words2.txt 
grep -e 'y.y' -e 'ee' words2.txt
grep -X '.*[y.y].*&.*[ee].*' words2.txt 
grep -X '.[*y.y].*&.[*ee].*' words2.txt

これらのコマンドの中には、2 つの y または 2 つの連続した e を返すものがありますが、これらの条件の両方を含む単語は返しません。どうすればよいでしょうか?

答え1

ファイルは次のようになっていると想定しています:

beeyy yeey open iee eey yeefy
funny reenydy jyyee

は と呼ばれますwords2.txt。はい、内容はランダムです。連続したee2 つの文字を含む単語のセットが表示されますy

< words2.txt tr ' ' '\n' | grep 'ee' | grep 'y.*y'

これは、まず各単語が で独自の行にあることを確認しtr、次にgrep2 つの連続する に対して を使用しe、次にgrep2 つの (連続していない可能性もある) に対して再度 を使用しますy。それぞれがgrepフィルターであるため、最終結果は連続するeeと 2 つのの両方を含む単語のセットになりますy

私の入力では、結果は次のようになります。

beeyy
yeey
yeefy
reenydy
jyyee

答え2

あなたが望むと仮定するとちょうど2つ ysとnot少なくとも2つygrepPCRE サポート付きでビルドされた場合、GNU では次のようになります。

grep -Pow '(?=\w*y\w*y)(?!\w*y\w*y\w*y)\w*ee\w*'

またはast-opengrep(2014-01-26 以降):

grep -Xow '\w*ee*\w*&\w*y\w*y\w*&(\w*y\w*y\w*y\w*)!'

少なくとも1つのシーケンスが必要な場合は、ちょうど2つ es (かつ 3 以上ではない)、つまり、eeyyまたはには一致するeeyyeeeが には一致しないeeeyy) の場合、GNU は次のようになりますgrep -P

grep -Pow '(?=\w*y\w*y)(?!\w*y\w*y\w*y)\w*(?<!e)ee(?!e)\w*'

答え3

Fox の回答のバリエーションです:

grep -Po '\w*ee\w*'  words.txt | grep 'y.*y'

ちょうど 2 秒が必要な場合y:

... | grep -v 'y.*y.*y' 

関連情報