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

时间:2015-10-28 16:37:10

标签: regex bash unix grep word-boundary

我需要在unix(bash)中使用egrep(或grep -e)在文件中找到重复的单词

我试过了:

egrep "(\<[a-zA-Z]+\>) \1" file.txt

egrep "(\b[a-zA-Z]+\b) \1" file.txt

但出于某种原因,这些人认为重复的事情并非如此! 例如,它认为字符串&#34;单词&#34;尽管有边界条件\>\b,但仍符合标准。

4 个答案:

答案 0 :(得分:4)

\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

答案 1 :(得分:1)

这是预期的行为。查看override func viewDidAppear(animated: Bool) { let predicate = NSPredicate(format: "username != '"+userName+"'") var query = PFQuery(className: "_User", predicate: predicate) do { var objects = try query.findObjects() for object in objects { **self.resultsUsernameArray.append(object.username!!)** self.resultsProfileNameArray.append(object["profileName"] as! String) } } catch _ { //Error handling, if needed } } 说的内容:

  

反斜杠字符和特殊表达

     

符号\&lt;和&gt;分别匹配空字符串   一个词的开头和结尾。符号\ b与空字符串匹配   一个单词的边缘,\ B匹配空字符串,前提是它不是   在一个词的边缘。符号\ w是[ [:alnum:]]和的同义词   \ W是[^ [:alnum:]]的同义词。

然后在另一个地方,我们会看到&#34; word&#34;是:

  

匹配控制

     

单词构成字符是字母,数字和下划线。

这就是产生的结果:

man grep

答案 2 :(得分:0)

我用

if ($images) {
    $imgDir = $this->container->getparameter('kernel.root_dir').'/../web/user/images';
    $artist->setImages(array_map(function ($img) use ($imgDir) {
        $imgName = md5(uniqid()).'.'.$img->guessExtension();
        $img->move($imgDir, $imgName);

        return $imgName;
    }, $images));
}

$em->persist($artist);
$em->flush();

检查我的文档是否存在此类错误。如果重复的单词之间存在换行符,这也有效。

说明:

  • pcregrep -M '(\b[a-zA-Z]+)\s+\1\b' * 以多线模式运行(如果在重复的单词之间换行,则很重要。
  • -M, --multiline:匹配单词
  • [a-zA-Z]+:字边界,请参阅tutorial
  • \b将其分组
  • (\b[a-zA-Z]+)匹配至少一个(但必要时更多)空格字符。这包括换行符。
  • \s+:匹配第一组中的内容

答案 3 :(得分:-1)

egrep "(\<[a-zA-Z]+>) \<\1\>" file.txt

解决了这个问题。

基本上,你必须告诉\ 1它还需要保持字边界