我正在尝试匹配vowels
按顺序排列的模式,不应该重复,可以用non-vowels
分隔。
目前我只是使用a
和e
对其进行测试。但是,我没有得到我期望的输出。
grep 'a[^aeiou]*e[^aeiou]*'
因此,例如ae
,abeb
,abbbbbbeb
都应匹配。
但是,aeeb
不应该匹配。
凭我的正则表达式,为什么这匹配?
我原以为e
中的第一个aeeb
会与e
中的a[^aeiou]*e[^aeiou]*
匹配,其余的正则表达式会失败吗?
感谢您的帮助。
答案 0 :(得分:2)
a[^aeiou]*e[^aeiou]*
与ae
中的aeeb
匹配。
如果你想确保第aeeb
行不匹配,你必须锚定正则表达式:
^a[^aeiou]*e[^aeiou]*$
答案 1 :(得分:1)
使用字符串^
的开头和字符串$
锚点的结尾。
#!/bin/sh
STRING=$( cat <<EOF
ae
abeb
abbbbbbeb
aeeb
EOF
)
echo "$STRING" | grep '^a[^aeiou]*e[^aeiou]*$'
## ae
## abeb
## abbbbbbeb
答案 2 :(得分:0)
我对此已经太晚了,但对于后来遇到这种情况的人来说,你可以简单地使用:
grep -P "a.*e.*i.*o.*u" myfile.txt
用简单的英语,这是一个&#39; a&#39;其次是0或更多的任何其他字母,然后是&#39; e&#39;,然后是0或更多的任何其他字母,依此类推。
如果您正在搜索/ usr / shares / dict /中的字典,那么这将与其他工作代码片段相同。但是,值得一提的是,这与整个单词不符。它只会匹配第一个&#39; a&#39;到第一个&#39; u&#39; (假设&#39; u&#39;是匹配元音序列中的最后一个字母),省略前导和尾随字符。例如,在&#39; facetious&#39;只有&#39; etiou&#39;将匹配。如果要匹配整个单词,可以将正则表达式修改为:
grep -P ".*a.*e.*i.*o.*u.*" myfile.txt
请注意&#39;。*&#39;在开始和结束。
希望这有帮助。
答案 3 :(得分:0)
你也应该在前面加上一个非元音括号表达式,以便考虑以你以外的字符开头的单词,因为你最后允许它:
egrep '^[^aeiou]*a[^aeiou]*e[^aeiou]$'