使用grep搜索其中包含点的字符串


192

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

grep -r "0.49" *

但是发生的是,我也收到了包含字符串等的不良结果04490949等等。问题是linux将dot(。)视为任何字符并得出所有结果。但是我只想得到“ 0.49”的结果。

Answers:


232

grep使用正则表达式;.在正则表达式中表示“任何字符”。如果你想有一个文本字符串,使用grep -Ffgrep或逃避.\.

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

因此,您的命令将需要是:

grep -r "0\.49" *

要么

grep -r 0\\.49 *

要么

grep -Fr 0.49 *

58
我需要像这样逃脱两次\\.才能起作用。我正在使用zsh。
Nikos Renieris

5
@NikosRenieris您是否用双引号包裹了grepping字符串?
Justus Romijn

@JustusRomijn我想我做到了,是的。
Nikos Renieris

15
您也需要使用\\.bash,或者使用bash "\."将其转出外壳。
Tomofumi

36

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


22

您需要转义.as "0\.49"

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



5

您也可以使用“ [。]”

grep -r "0[.]49"


4

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

例如。grep -r“ 0 \ .49”


提醒未来的读者,\.必须使用引号将其括起来才能起作用。
水果

4

这里有这么多的答案建议用点来逃脱,\.但是我已经一遍又一遍地遇到这个问题:\.给我的结果与.

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

$ grep -r 0\\.49 *

和:

$ grep -r 0[.]49 *

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


3
您需要从外壳引用正则表达式,或者转义反斜杠本身,以便外壳不使用它。grep '\.'grep \\.(我强烈建议使用前者。双引号也可以使用,就像在原始问题中一样;但是单引号更易于理解和使用。例如,对于双引号,在某些情况下,您仍然需要将反斜杠加倍)。
Tripleee '18

恕我直言,这是最清晰正确的答案,@ tripleee的评论是最完整的。使用[](其功能代表与单个字符匹配的字符子集)是一个不错的技巧。
jringoot

@jringoot认真吗?我认为这根本不清楚-它看起来更像是一个不熟悉报价的人的后续问题。
Tripleee '18

很明显,因为这两个表达式都可以直接工作,并且实际上许多其他表达式都使用了引号或需要使用双转义,以避免shell进行次要的解释。我无法再更改评论(最多5分钟)。我的评论可能会更好:“如果与@tripleee的评论结合使用,这将是最完整的答案。因为这两个命令都可以立即工作并且带有引号就可以了”
jringoot

1
我通常建议的是“总是对正则表达式单引号”。它不是“完整的”,但是可以完成工作,并且意味着您需要了解报价或遵循此简单规则。
三月

0

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

$ cat foo |grep -- "0\.49"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.