是否可以使用grep查找同一单词多次出现的行?

是否可以使用grep查找同一单词多次出现的行?,grep,Grep,是否可以编写(一行)grep表达式来查找包含同一单词三次出现的行?请注意,我们不知道这个词的先验。以下代码段包含大多数情况: $ grep -E '(\w+)[[:space:]]+\1[[:space:]]+\1' test_data.txt 然而,这并没有抓住以下积极的例子: 午餐晚餐晚餐晚餐午餐 还要注意,我们只寻找完整的单词,而不是简单的字符重复。因此,一个反面例子是: 他采摘t他花朵t他重新采摘 编辑(感谢@lev levitsky): 事实上,上面的正面例子被捕捉到了,但下面的例子

是否可以编写(一行)grep表达式来查找包含同一单词三次出现的行?请注意,我们不知道这个词的先验。以下代码段包含大多数情况:

$ grep -E '(\w+)[[:space:]]+\1[[:space:]]+\1' test_data.txt
然而,这并没有抓住以下积极的例子:

午餐晚餐晚餐晚餐午餐

还要注意,我们只寻找完整的单词,而不是简单的字符重复。因此,一个反面例子是:

采摘t花朵t重新采摘

编辑(感谢@lev levitsky):

事实上,上面的正面例子被捕捉到了,但下面的例子却没有被捕捉到:


午餐午餐晚餐午餐

这既不是
grep
也不是
regex
,但它可能有效:

awk -F"[,. \t]*" '{for (i=1;i<=NF;i++) {if (++a[$i]==3) {printf "%s ",$i;f=1}} if (f) print "";f=0;delete a}' file

awk-F“[,.\t]*”{for(i=1;i这应该适合您:

grep -E "[[:<:]](\w+)[[:>:]].*[[:<:]]\1[[:>:]].*[[:<:]]\1[[:>:]]" testfile
grep-E“[[::].[[::].[[::].[::]]测试文件
例如:

paul@horus:~/src/sandbox$ cat testfile
how is summer summer summer ha ha
this summer is a hot summer of summers yes it is
summer summer summer
there is only one summer in this sentence
summer appears as the first and last summer words in this summer
the summertime is always in summer, one of several summers
the summer of which we speak is summery but is a real summer summer, yes
this also works with cats, since there are three cats in these cats, ha!
paul@horus:~/src/sandbox$ grep -E "[[:<:]](\w+)[[:>:]].*[[:<:]]\1[[:>:]].*[[:<:]]\1[[:>:]]" testfile
how is summer summer summer ha ha
summer summer summer
summer appears as the first and last summer words in this summer
the summer of which we speak is summery but is a real summer summer, yes
this also works with cats, since there are three cats in these cats, ha!
paul@horus:~/src/sandbox$ 
paul@horus:~/src/sandbox$cat测试文件
夏天怎么样?哈哈
这个夏天是夏天中的一个炎热的夏天是的
夏夏
这句话里只有一个夏天
夏天是这个夏天的第一个也是最后一个夏天的词
夏天总是在夏天,是几个夏天中的一个
我们所说的夏天是夏天,但却是真正的夏天,是的
这也适用于猫,因为这些猫里面有三只猫,哈!
paul@horus:~/src/sandbox$grep-E“[[::].[[::].[[::].[[:::]]测试文件
夏天怎么样?哈哈
夏夏
夏天是这个夏天的第一个也是最后一个夏天的词
我们所说的夏天是夏天,但却是真正的夏天,是的
这也适用于猫,因为这些猫里面有三只猫,哈!
paul@horus:~/src/sandbox$

[[::]]
分别匹配单词开头和结尾的空字符串,这样您就可以使用它们来确定单词边界,而不必假设单词是由空格分隔的,而不是由标点符号等分隔的。

但它确实抓住了晚饭的例子。它是否匹配由其他单词分隔的三个单词?是的,您是正确。将其更改为“午餐”,但不会被捕获。在本例中,它不起作用:$echo“晚餐”。| awk'{for(i=1;i@user313967通过添加字段分隔符
-F“[,.\t]*”进行修复
PS在
regex
中也必须考虑到这一点。为您的解决方案找到了一个稍微紧凑的符号:grep-E'\.\.\.\\\\'testfile