使用grep搜索带有点的字符串

269

我正在尝试使用命令搜索包含点号的字符串0.49

grep -r "0.49" *

但是我也得到了一些不想要的结果,这些结果包含字符串,例如04490949等。问题在于linux认为点(.)可以代表任何字符,并输出所有结果。但是我只想得到"0.49"的结果。

9个回答

346

grep使用正则表达式,.在正则表达式中表示“任何字符”。如果你想要匹配一个字面字符串,请使用grep -Ffgrep或者对.进行转义,如\.

别忘了用双引号括起来你的字符串。否则你应该使用\\.

所以,你的命令应该是:

grep -r "0\.49" *
或者
grep -r 0\\.49 *
或者
grep -Fr 0.49 *

73
我需要两次转义才能使它正常工作,如此 \\.。 我正在使用 zsh。 - VelocityRa
5
@NikosRenieris,你是否使用双引号将你的匹配字符串括起来了? - Justus Romijn
@JustusRomijn 我想我是这样做了,是的。 - VelocityRa
19
在Bash中,你需要使用\\.来转义句点,或者使用"\.""将其从shell中转义。 - Tomofumi
1
这些解决方案都对我没用,正在zsh中运行。 - bgenchel
@VelocityRa 在bash中,只有\\.对我起作用。 - undefined

40

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


25

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

. 是一个正则表达式元字符,用于匹配任何字符(除了换行符)。如果要匹配字面上的句点,您需要对其进行转义。


15

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

然而,对我来说这两个表达式都有效:

$ grep -r 0\\.49 *

并且:

$ grep -r 0[.]49 *

我在Ubuntu和Archlinux上使用“正常的”bash shell。

编辑,或者根据评论:

$ grep -r '0\.49' *

注意,这里使用的是单引号,这点很重要。


5
你需要引用外壳中的正则表达式,或者转义反斜杠本身以使外壳无法使用它。可以使用 grep '\.'grep \\.(我强烈建议使用前者)。双引号也可以工作,就像原始问题中一样,但是单引号更容易理解和使用。例如,在使用双引号时,在某些情况下仍然需要加倍反斜杠。 - tripleee
在我看来,这是最清晰正确的答案,加上@tripleee的评论,它也是最完整的。使用 [ ](用于表示要匹配单个字符的字符子集)是一个不错的技巧。 - jringoot
@jringoot 真的吗?我认为这一点都不清楚——它看起来更像是一个对引用不熟悉的人的后续问题。 - tripleee
这是很明显的,因为两个表达式都可以直接工作,实际上许多其他表达式都假定引用或需要双重转义以避免被 shell 进行二次解释,这是微不足道的。我不能再更改评论了(5 分钟限制)。我的评论可能会更好: “如果与 @tripleee 的评论结合起来,这就是最完整的答案。因为两个命令都可以立即工作,并且使用引号是完整的。” - jringoot
2
我通常建议的是“始终使用单引号引用你的正则表达式”。这并不是“完美”的,但它能够完成工作,并意味着你需要理解引用或遵循这个简单的规则。 - tripleee

7

您也可以使用"[.]"

grep -r "0[.]49"

使用 egrep 是我能够让它正常工作的唯一选项。 - Noah Friedman

6

只需转义.

grep -r "0\.49"


5

转义句点。示例命令如下:

grep '0\.00'

4

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

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


提醒未来的读者,\.需要用引号括起来才能使其正常工作。 - 林果皞

1

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接