Grep找到包含两个z和两个a的单词

时间:2017-04-25 07:51:58

标签: regex grep

我希望找到包含两个z的单词,它们之间有两个a(不一定是连续的),例如zeabraze。到目前为止,我得到了这个,但它只捕获zz或aa。

\bz{2}|a{2}\b

注意:我想找到包含两个z和两个a s的单词。

3 个答案:

答案 0 :(得分:1)

使用

grep -oiE '\b[b-y]*z([b-y]*a){2}[b-y]*z[b-y]*\b'

o选项将提取匹配项,i将使模式不区分大小写,E将允许ERE语法(无需转义()和{{1使它们成为特殊的正则表达式运算符。)

<强>详情:

  • {} - 领先的字边界
  • \b - 来自定义范围的0+个字母(无[b-y]*,无a,所有其他字母都匹配)
  • z - z
  • z - 2次出现
    • ([b-y]*a){2} - 除[b-y]*a以外的0 + ASCII字母
    • z - a
  • a - 除[b-y]*a以外的0 + ASCII字母
  • z - z
  • z - 除[b-y]*a以外的0 + ASCII字母
  • z - 尾随字边界

请参阅grep demo

\b

仅返回echo 'zeaz zeabraze zeazaz' | grep -oiE '\b[b-y]*z([b-y]*a){2}[b-y]*z[b-y]*\b'

答案 1 :(得分:0)

如果您的单词仅包含标准字母数字(a-z和0-9)z[B-Yb-y]*a[B-Yb-y]*a[B-Yb-y]*z,如果有更多字符可以在[]之间添加。

这个正则表达式意味着:

  • z - 查找以字母z开头的序列,
  • [B-Yb-y]*然后可以跟by之间的任意数量的字母(表示除az之外的所有字母)。< / LI>
  • a然后我们确保至少有一个a。如果它也可以是大写字母“A”,请更改为[aA]
  • [B-Yb-y]*a我们的第一个a后面可以跟不包含az本身的任何字母组合,然后是另一个a
  • [B-Yb-y]*以及上一次az
  • 之间的任意字母组合
  • z最后,我们的字符串必须以z
结尾

答案 2 :(得分:0)

awk 方法:

echo "zeabraze axaxzxzxz acaxzcz" | awk -v RS=" " '/^[^z]*z[^z]*z[^z]*$/ && /^[^a]*a[^a]*a[^a]*$/'

输出:

zeabraze
acaxzcz