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

使用Grep和Regex在一行上搜索多个匹配项,regex,command-line,grep,Regex,Command Line,Grep,我正在尝试使用Grep和wc-l打印文本文件中一行有3个或更多元音的单词数 现在,我正在输入: grep -i -E '<\.*[aeiou]{3}.*\>' file.txt | wc -l 我期望的输出是4,而不是3,目前我只能得到3 我在网上寻找解决方案已经有一段时间了,但我就是想不出来。有人能帮忙吗?你应该分两步来做 首先,将文件拆分为单词: tr -s '[[:punct:][:space:]]' '\n' < file.txt > wordsFile.txt

我正在尝试使用
Grep
wc-l
打印文本文件中一行有3个或更多元音的单词数

现在,我正在输入:

grep -i -E '<\.*[aeiou]{3}.*\>' file.txt | wc -l
我期望的输出是4,而不是3,目前我只能得到3


我在网上寻找解决方案已经有一段时间了,但我就是想不出来。有人能帮忙吗?

你应该分两步来做

首先,将文件拆分为单词:

tr -s '[[:punct:][:space:]]' '\n' < file.txt > wordsFile.txt

要在单独的行中获取每个匹配的单词,请使用
-o
选项:

$ grep -iEo '[[:alnum:]]*[aeiou]{3}[[:alnum:]]*' file.txt
beautiful
courteous
beautiful
courteous
$ grep -iEo '[[:alnum:]]*[aeiou]{3}[[:alnum:]]*' file.txt | wc -l
4
[[:alnum:][]*[aeiou]{3}[[:alnum:][]*
匹配具有三个连续元音的单词
-o
确保每个单词位于单独的行中

如果你想对一个词的定义更加严格,你可以使用
[[:alpha:][]*[aeiou]{3}[:alpha:][]*

文档 从
man grep

-o、 --仅匹配
仅打印匹配的(非空) 匹配行的一部分,每一部分在单独的输出上 线路

讨论 考虑:

\<.*[aeiou]{3}.*\>'
\'
在上面,请注意,
匹配任何字符,
*
是贪婪的:它匹配最长的匹配。因此,
\
将从那里匹配到行中最后一个单词的末尾。这不是你需要的

$ grep -iEo '[[:alnum:]]*[aeiou]{3}[[:alnum:]]*' file.txt
beautiful
courteous
beautiful
courteous
$ grep -iEo '[[:alnum:]]*[aeiou]{3}[[:alnum:]]*' file.txt | wc -l
4
\<.*[aeiou]{3}.*\>'