【问题标题】:Using grep to search for a string that has a dot in it使用 grep 搜索包含点的字符串
【发布时间】:2012-05-07 23:26:09
【问题描述】:

我正在尝试使用命令搜索字符串0.49(带点)

grep -r "0.49" *

但是发生的事情是我也得到了不需要的结果,其中包含诸如04490949 等字符串。问题是 linux 将 dot(.) 视为任何字符并显示所有结果。但我只想得到“0.49”的结果。

【问题讨论】:

    标签: linux grep


    【解决方案1】:

    这里有很多答案建议用\. 转义点,但我一遍又一遍地遇到这个问题:\. 给了我与. 相同的结果

    但是,这两个表达式对我有用:

    $ grep -r 0\\.49 *
    

    还有:

    $ grep -r 0[.]49 *
    

    我在 Ubuntu 和 Archlinux 上使用“普通”的 bash shell。

    编辑, 或者,根据 cmets:

    $ grep -r '0\.49' *
    

    注意,-引号在这里起到了不同的作用。

    【讨论】:

    • 您需要从外壳中引用正则表达式,或者转义反斜杠本身,这样外壳就不会使用它。 grep '\.'grep \\. (我强烈推荐前者。双引号也可以工作,就像在原始问题中一样;但单引号更容易理解和使用。例如,使用双引号,你仍然需要在某些情况下加倍反斜杠)。
    • 恕我直言,这是最清楚的正确答案,加上@tripleee的评论是最完整的。使用 [ ](表示字符子集以匹配单个字符的函数)是一个不错的技巧。
    • @jringoot 认真的吗?我认为这根本不清楚——它看起来更像是一个不熟悉引用的人提出的后续问题。
    • 很明显,因为这两个表达式都直接起作用,而且实际上许多其他表达式都假定引用或需要双重转义以避免 shell 的二次解释是微不足道的。我不能再更改评论(限制 5 分钟)。我的评论可能会更好:“如果结合@tripleee 的评论,这是最完整的答案。因为这两个命令都可以立即工作并且引用它是完整的”
    • 我通常推荐的是“总是单引号你的正则表达式”。它不是“完整的”,但它完成了工作,并暗示你要么需要理解报价,要么遵守这个简单的规则。
    【解决方案2】:

    您也可以使用 -- 选项进行搜索,该选项基本上会忽略所有特殊字符,并且不会被 grep 解释。

    $ cat foo |grep -- "0\.49"
    

    【讨论】:

      【解决方案3】:

      grep 使用正则表达式; . 表示正则表达式中的“任何字符”。如果您想要文字字符串,请使用grep -Ffgrep,或将. 转义为\.

      不要忘记将字符串用双引号括起来。否则你应该使用\\.

      所以,你的命令需要是:

      grep -r "0\.49" *
      

      grep -r 0\\.49 *
      

      grep -Fr 0.49 *
      

      【讨论】:

      • 我需要像\\. 那样逃脱两次才能让它工作。我正在使用 zsh。
      • @NikosRenieris 你用双引号包裹你的 grepping 字符串了吗?
      • @JustusRomijn 我想我做到了,是的。
      • 你也需要使用 \\. 来实现 bash,或者使用 "\." 将它从 shell 中转义。
      【解决方案4】:

      你也可以使用“[.]”

      grep -r "0[.]49"
      

      【讨论】:

      • 使用 egrep 这是我能够开始工作的唯一选择
      【解决方案5】:

      您可以使用 \ 转义点和其他特殊字符

      例如。 grep -r "0\.49"

      【讨论】:

      • 提醒未来的读者,\. 需要用引号括起来才能使其正常工作。
      【解决方案6】:

      grep -F -r '0.49' * 将 0.49 视为“固定”字符串而不是正则表达式。这让.失去了它的特殊意义。

      【讨论】:

        【解决方案7】:

        只需转义.

        grep -r "0\.49"

        【讨论】:

          【解决方案8】:

          转义点。示例命令将是。

          grep '0\.00'
          

          【讨论】:

            【解决方案9】:

            您需要将. 转义为"0\.49"

            . 是一个正则表达式元字符,可以匹配任何字符(换行符除外)。要匹配文字句点,您需要对其进行转义。

            【讨论】:

              猜你喜欢
              • 2014-05-18
              • 1970-01-01
              • 1970-01-01
              • 2021-06-12
              • 2019-05-17
              • 2013-06-26
              • 2013-11-10
              • 2011-05-25
              • 1970-01-01
              相关资源
              最近更新 更多