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

5
我将使用Grepwc -l来打印出一个文本文件中有3个或更多元音字母连续的单词数量。目前,我输入的命令是:
grep -i -E '<\.*[aeiou]{3}.*\>' file.txt | wc -l

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

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

beautiful courteous 
beautiful 
courteous

我希望输出的结果是4而不是3,但目前我只能得到3。

我在网上寻找了一段时间的解决方案,但似乎无法解决。请问有人可以帮忙吗?

2个回答

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
[[:alnum:]]*[aeiou]{3}[[:alnum:]]*匹配具有三个连续元音字母的单词。 -o确保每个单词位于单独的一行。
如果您想更严格地定义一个单词,您可能需要使用[[:alpha:]]*[aeiou]{3}[[:alpha:]]*

文档

man grep

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

讨论

考虑以下内容:
\<.*[aeiou]{3}.*\>'

在上述内容中,需要注意的是 . 可以匹配任何字符,而 .* 是贪婪的:它会匹配最长可能的字符串。因此,\<.*[aeiou]{3}将从行首第一个单词开始匹配,一直到该行上最后一个连续三个元音字母的位置。最后的.*\>将从那里匹配到该行上最后一个单词的结尾。这并不是你所需要的。

0
你应该分两步完成它...
第一步是将文件拆分为单词:
tr -s '[[:punct:][:space:]]' '\n' < file.txt > wordsFile.txt

然后你数匹配的单词:

grep -i -E '.*[aeiou]{3}.*' wordsFile.txt | wc -l

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接