需要 grep+regex 方面的帮助

需要 grep+regex 方面的帮助

我试图找到包含两个连续 e 且还包含两个 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

其中一些命令给出两个 y 或两个连续的 e,但不给出包含这两个条件的单词。我现在应该怎么做?

答案1

我假设你的文件看起来像这样:

beeyy yeey open iee eey yeefy
funny reenydy jyyee

并被称为words2.txt.是的,内容有点随机。这将显示包含连续字符ee和两个y字符的单词集:

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

这首先确保每个单词与 位于自己的行上tr,然后greps 代表两个连续的e,然后grep再次 s 代表两个(可能不连续)y。由于每个都是过滤器,因此最终结果是包含 Continuous和 Two 的grep单词集。eey

根据我的输入,结果是:

beeyy
yeey
yeefy
reenydy
jyyee

答案2

假设你想要正好两个 y是而不是至少y两个grep,如果使用 PCRE 支持构建,则使用 GNU :

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

或者与ast-开放grep(2014年1月26日或更新):

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

如果你还想要至少一个序列正好两个 es (而不是 3 个或更多),即例如匹配eeyyeeyyeee但不匹配eeeyy),与 GNU grep -P

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

答案3

只是福克斯答案的一个变体:

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

如果你想要正好 2y秒:

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

相关内容