繁体   English   中英

如何使用grep / egrep在文件中找到重复的单词?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM