我正在尝试使用Grep
和wc -l
来打印文本文件中连续3个或更多元音的单词数。
现在,我正在输入:
grep -i -E '<\.*[aeiou]{3}.*\>' file.txt | wc -l
但这并没有返回正确数量的单词,因为在某些行上有多个单词连续有3个元音。
如果file.txt包含:
beautiful courteous
beautiful
courteous
我想要的输出是4,而不是3,目前我只能得到3。
我一直在网上寻找解决方案,但我似乎无法弄明白。有人可以帮忙吗?
答案 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