【发布时间】:2022-09-23 01:59:41
【问题描述】:
元音不必连续出现。
-
我想你的意思是
grep -P \'([aeiouy][^aeiouy]*){3}\'
元音不必连续出现。
grep -P \'([aeiouy][^aeiouy]*){3}\'
这项工作可以使用awk 轻松完成,而无需使用任何正则表达式。只需将字段分隔符设置为其中一个元音,然后确保我们有 4 个字段:
awk -F '[aeiouy]' 'NF == 4' file
PS:y 不是真正的元音,但由于您显示的示例而被包括在内。
【讨论】:
使用[^aeiouy] 匹配非元音。在每个元音模式周围放置一系列这些。
grep -x '[^aeiouy]*[aeiouy][^aeiouy]*[aeiouy][^aeiouy]*[aeiouy][^aeiouy]*' filename
使用-x 选项匹配整行,或使用^ 和$ 锚定正则表达式。
您不需要 PCRE,这只使用传统的正则表达式模式。
【讨论】:
grep -xE '[^aeiouy]*([aeiouy][^aeiouy]*){3}' filename?
使用任何 awk:
$ echo 'bonfire' | awk 'gsub(/[aeiouy]/,"&")==3'
bonfire
$ echo 'beak' | awk 'gsub(/[aeiouy]/,"&")==3'
$ echo 'yearbook' | awk 'gsub(/[aeiouy]/,"&")==3'
$
【讨论】:
对于 Perl 兼容的正则表达式,您不需要 -P。
如果您想使用 grep 匹配 exactly 3 vowels,您可以使用锚点并匹配被否定字符类 [^aeiouy]* 的可选重复包围的 3 个元音,匹配除元音以外的任何字符。
grep '^[^aeiouy]*\([aeiouy][^aeiouy]*\)\{3\}$' file
或-E
grep -E '^[^aeiouy]*([aeiouy][^aeiouy]*){3}$' file
如果你想要至少 3 个元音:
grep -E '([aeiouy][^aeiouy]*){2}[aeiouy]' file
【讨论】: