【问题标题】:How can I find repeated words in a file using grep/egrep?如何使用 grep/egrep 在文件中查找重复的单词?
【发布时间】:2015-10-28 16:37:10
【问题描述】:

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

我试过了:

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

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

但出于某种原因,这些人认为事情不是重复的! 例如,尽管存在单词边界条件\&gt;\b,但它认为字符串“word words”符合条件。

【问题讨论】:

  • 为了更好地理解,展示一些示例输入、期望的输出等。我们现在唯一能说的是“是的,它按预期工作”。

标签: regex bash unix grep word-boundary


【解决方案1】:

\1 匹配第一次捕获匹配的任何字符串。这与匹配与第一次捕获匹配的相同模式不同。因此,在单词边界上匹配的第一个捕获不再相关,即使 \b 在捕获括号内。

如果您希望第二个实例也位于单词边界上,则需要这样说:

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

这与:

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

模式中的空格强制使用单词边界,因此我删除了多余的\bs。如果您想更明确,可以将它们放入:

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

【讨论】:

    【解决方案2】:

    我用

    pcregrep -M '(\b[a-zA-Z]+)\s+\1\b' *
    

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

    解释:

    • -M, --multiline 在多行模式下运行(如果重复的单词之间有换行符,这一点很重要。
    • [a-zA-Z]+:匹配单词
    • \b:字边界,见tutorial
    • (\b[a-zA-Z]+)分组
    • \s+ 匹配至少一个(但根据需要更多)空白字符。这包括换行符。
    • \1:匹配第一组中的任何内容

    【讨论】:

      【解决方案3】:

      这是预期的行为。看看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"
      

      【讨论】:

        【解决方案4】:
        egrep "(\<[a-zA-Z]+>) \<\1\>" file.txt
        

        解决问题。

        基本上,您必须告诉 \1 它也需要保持在单词边界内

        【讨论】:

        • 不起作用,因为 \&gt;&gt; 不同。 (除了错字之外,它与接受的答案有何不同?)另外,请学习如何格式化代码,以便 &lt;&gt; 不会被解释为 HTML。见
        猜你喜欢
        • 1970-01-01
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-30
        • 2023-03-21
        • 2021-02-22
        • 1970-01-01
        相关资源
        最近更新 更多