我希望找到包含两个z的单词,它们之间有两个a(不一定是连续的),例如zeabraze。到目前为止,我得到了这个,但它只捕获zz或aa。
\bz{2}|a{2}\b
注意:我想找到包含两个z
和两个a
s的单词。
答案 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]*
然后可以跟b
和y
之间的任意数量的字母(表示除a
和z
之外的所有字母)。< / LI>
a
然后我们确保至少有一个a
。如果它也可以是大写字母“A”,请更改为[aA]
[B-Yb-y]*a
我们的第一个a
后面可以跟不包含a
或z
本身的任何字母组合,然后是另一个a
[B-Yb-y]*
以及上一次a
和z
z
最后,我们的字符串必须以z
答案 2 :(得分:0)
awk 方法:
echo "zeabraze axaxzxzxz acaxzcz" | awk -v RS=" " '/^[^z]*z[^z]*z[^z]*$/ && /^[^a]*a[^a]*a[^a]*$/'
输出:
zeabraze
acaxzcz