我正在尝试使用命令搜索包含点号的字符串0.49
grep -r "0.49" *
但是我也得到了一些不想要的结果,这些结果包含字符串,例如0449
,0949
等。问题在于linux认为点(.)可以代表任何字符,并输出所有结果。但是我只想得到"0.49"的结果。
grep
使用正则表达式,.
在正则表达式中表示“任何字符”。如果你想要匹配一个字面字符串,请使用grep -F
、fgrep
或者对.
进行转义,如\.
。
别忘了用双引号括起来你的字符串。否则你应该使用\\.
所以,你的命令应该是:
grep -r "0\.49" *
或者grep -r 0\\.49 *
或者grep -Fr 0.49 *
grep -F -r '0.49' *
将 0.49 视为“固定”字符串而非正则表达式。这使得 .
失去了其特殊意义。
你需要将 .
转义为 "0\.49"
。
.
是一个正则表达式元字符,用于匹配任何字符(除了换行符)。如果要匹配字面上的句点,您需要对其进行转义。
这里有很多回答建议用\.
来转义句点,但我一遍又一遍地遇到同样的问题:\.
给我的结果与.
相同。
然而,对我来说这两个表达式都有效:
$ grep -r 0\\.49 *
并且:
$ grep -r 0[.]49 *
我在Ubuntu和Archlinux上使用“正常的”bash shell。
编辑,或者根据评论:
$ grep -r '0\.49' *
注意,这里使用的是单引号,这点很重要。
grep '\.'
或 grep \\.
(我强烈建议使用前者)。双引号也可以工作,就像原始问题中一样,但是单引号更容易理解和使用。例如,在使用双引号时,在某些情况下仍然需要加倍反斜杠。 - tripleee您也可以使用"[.]"
grep -r "0[.]49"
只需转义.
grep -r "0\.49"
转义句点。示例命令如下:
grep '0\.00'
您可以使用 \ 来转义点和其他特殊字符。
例如:grep -r "0\.49"
\.
需要用引号括起来才能使其正常工作。 - 林果皞你还可以使用 -- 选项进行搜索,该选项基本上忽略所有特殊字符,并且不会被grep解释。
$ cat foo |grep -- "0\.49"
\\.
。 我正在使用 zsh。 - VelocityRa\\.
来转义句点,或者使用"\.""
将其从shell中转义。 - Tomofumi\\.
对我起作用。 - undefined