【发布时间】:2012-05-07 23:26:09
【问题描述】:
我正在尝试使用命令搜索字符串0.49(带点)
grep -r "0.49" *
但是发生的事情是我也得到了不需要的结果,其中包含诸如0449、0949 等字符串。问题是 linux 将 dot(.) 视为任何字符并显示所有结果。但我只想得到“0.49”的结果。
【问题讨论】:
我正在尝试使用命令搜索字符串0.49(带点)
grep -r "0.49" *
但是发生的事情是我也得到了不需要的结果,其中包含诸如0449、0949 等字符串。问题是 linux 将 dot(.) 视为任何字符并显示所有结果。但我只想得到“0.49”的结果。
【问题讨论】:
这里有很多答案建议用\. 转义点,但我一遍又一遍地遇到这个问题:\. 给了我与. 相同的结果
但是,这两个表达式对我有用:
$ grep -r 0\\.49 *
还有:
$ grep -r 0[.]49 *
我在 Ubuntu 和 Archlinux 上使用“普通”的 bash shell。
编辑, 或者,根据 cmets:
$ grep -r '0\.49' *
注意,单-引号在这里起到了不同的作用。
【讨论】:
grep '\.' 或 grep \\. (我强烈推荐前者。双引号也可以工作,就像在原始问题中一样;但单引号更容易理解和使用。例如,使用双引号,你仍然需要在某些情况下加倍反斜杠)。
您也可以使用 -- 选项进行搜索,该选项基本上会忽略所有特殊字符,并且不会被 grep 解释。
$ cat foo |grep -- "0\.49"
【讨论】:
grep 使用正则表达式; . 表示正则表达式中的“任何字符”。如果您想要文字字符串,请使用grep -F、fgrep,或将. 转义为\.。
不要忘记将字符串用双引号括起来。否则你应该使用\\.
所以,你的命令需要是:
grep -r "0\.49" *
或
grep -r 0\\.49 *
或
grep -Fr 0.49 *
【讨论】:
\\. 那样逃脱两次才能让它工作。我正在使用 zsh。
\\. 来实现 bash,或者使用 "\." 将它从 shell 中转义。
你也可以使用“[.]”
grep -r "0[.]49"
【讨论】:
您可以使用 \ 转义点和其他特殊字符
例如。 grep -r "0\.49"
【讨论】:
\. 需要用引号括起来才能使其正常工作。
grep -F -r '0.49' * 将 0.49 视为“固定”字符串而不是正则表达式。这让.失去了它的特殊意义。
【讨论】:
只需转义.
grep -r "0\.49"
【讨论】:
转义点。示例命令将是。
grep '0\.00'
【讨论】:
您需要将. 转义为"0\.49"。
. 是一个正则表达式元字符,可以匹配任何字符(换行符除外)。要匹配文字句点,您需要对其进行转义。
【讨论】: