
私は、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
。はい、内容はランダムです。連続したee
2 つの文字を含む単語のセットが表示されますy
。
< words2.txt tr ' ' '\n' | grep 'ee' | grep 'y.*y'
これは、まず各単語が で独自の行にあることを確認しtr
、次にgrep
2 つの連続する に対して を使用しe
、次にgrep
2 つの (連続していない可能性もある) に対して再度 を使用しますy
。それぞれがgrep
フィルターであるため、最終結果は連続するee
と 2 つのの両方を含む単語のセットになりますy
。
私の入力では、結果は次のようになります。
beeyy
yeey
yeefy
reenydy
jyyee
答え2
あなたが望むと仮定するとちょうど2つ y
sとnot少なくとも2つy
のgrep
PCRE サポート付きでビルドされた場合、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つ e
s (かつ 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'