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

时间:2017-11-25 05:47:39

标签: regex command-line grep

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

现在,我正在输入:

grep -i -E '<\.*[aeiou]{3}.*\>' file.txt | wc -l

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

如果file.txt包含:

beautiful courteous 
beautiful 
courteous

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

我一直在网上寻找解决方案,但我似乎无法弄明白。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

要在单独的行中获取每个匹配的单词,请使用-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}.*\>'

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

答案 1 :(得分:0)

你应该分两步完成......

首先将文件拆分为单词:

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

然后你计算匹配的单词:

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