使用 Grep 和 Regex 在一行中搜索多个匹配项

Dev*_*Dog 5 regex command-line grep

我正在尝试使用Grepwithwc -l打印出文本文件中连续包含 3 个或更多元音的单词数。

现在,我正在输入:

grep -i -E '<\.*[aeiou]{3}.*\>' file.txt | wc -l
Run Code Online (Sandbox Code Playgroud)

但这并没有返回正确的单词数,因为在某些行上有多个单词连续有 3 个元音。

如果 file.txt 包含以下内容:

beautiful courteous 
beautiful 
courteous
Run Code Online (Sandbox Code Playgroud)

我想要的输出是 4,而不是 3,目前我只能得到 3。

我在网上寻找解决方案已经有一段时间了,但我似乎无法弄清楚。有人可以帮忙吗?

Joh*_*024 5

要将每个匹配的单词放在单独的行上,请使用以下-o选项:

$ grep -iEo '[[:alnum:]]*[aeiou]{3}[[:alnum:]]*' file.txt
beautiful
courteous
beautiful
courteous
$ grep -iEo '[[:alnum:]]*[aeiou]{3}[[:alnum:]]*' file.txt | wc -l
4
Run Code Online (Sandbox Code Playgroud)

[[:alnum:]]*[aeiou]{3}[[:alnum:]]*匹配具有三个连续元音的单词。 -o确保每个单词都在单独的行上。

如果您想对单词的定义更严格,您可能需要使用[[:alpha:]]*[aeiou]{3}[[:alpha:]]*

文档

man grep

-o, --only-matching
仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。

讨论

考虑:

\<.*[aeiou]{3}.*\>'
Run Code Online (Sandbox Code Playgroud)

在上面,请注意.匹配任何字符并且.*是贪婪的:它匹配最长的可能匹配。因此,\<.*[aeiou]{3}将从一行中第一个单词的开头到该行中连续三个元音的最后一个单词匹配。决赛.*\>将匹配从那里到该行最后一个单词的末尾。这不是你需要的。