[英]How can I find repeated words in a file using grep/egrep?
我需要在unix(bash)中使用egrep(或grep -e)在文件中找到重复的单词
我试过了:
egrep "(\<[a-zA-Z]+\>) \1" file.txt
和
egrep "(\b[a-zA-Z]+\b) \1" file.txt
但是出于某种原因,这些人认为事情不是重复! 例如,尽管单词边界条件\\>
或\\b
,它仍认为字符串“ word words”符合标准。
\\1
匹配第一次捕获匹配的任何字符串。 这与匹配与第一次捕获所匹配的模式不同。 因此,即使\\b
在捕获括号内,匹配单词边界的第一个捕获也不再相关。
如果您希望第二个实例也位于单词边界上,则需要这样说:
egrep "(\b[a-zA-Z]+) \1\b" file.txt
区别于:
egrep "\b([a-zA-Z]+) \1\b" file.txt
模式中的空格强制单词边界,因此我删除了多余的\\b
。 如果您想更加明确,可以将它们放在:
egrep "\<([a-zA-Z]+)\> \<\1\>" file.txt
这是预期的行为。 看看man grep
怎么说:
反斜杠字符和特殊表达
符号\\ <和>分别与单词开头和结尾的空字符串匹配。 符号\\ b匹配单词边缘的空字符串,\\ B匹配单词不在单词边缘的空字符串。 \\ w是[ [:alnum:]]的同义词,\\ W是[^ [:alnum:]] 的同义词 。
然后在另一个地方,我们看到“单词”是什么:
匹配控制
单词组成的字符是字母,数字和下划线。
因此,这将产生:
$ cat a
hello bye
hello and and bye
words words
this are words words
"words words"
$ egrep "(\b[a-zA-Z]+\b) \1" a
hello and and bye
words words
this are words words
"words words"
$ egrep "(\<[a-zA-Z]+\>) \1" a
hello and and bye
words words
this are words words
"words words"
我用
pcregrep -M '(\b[a-zA-Z]+)\s+\1\b' *
检查我的文档中是否存在此类错误。 如果重复的单词之间有换行符,这也可以使用。
说明:
-M, --multiline
在多行模式下运行(如果在重复的单词之间有换行符,则很重要。 [a-zA-Z]+
:匹配词 \\b
:单词边界,请参阅教程 (\\b[a-zA-Z]+)
分组 \\s+
匹配至少一个(但根据需要更多)空白字符。 这包括换行符。 \\1
:匹配第一组中的任何内容 egrep "(\<[a-zA-Z]+>) \<\1\>" file.txt
解决问题。
基本上,您必须告诉\\ 1它也必须保持字词边界
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.