Grep不作为正则表达式使用

124

我需要搜索一个 PHP 变量 $someVar。但是,Grep 认为我正在尝试运行一个正则表达式,并出现了错误:

$ grep -ir "Something Here" * | grep $someVar
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
$ grep -ir "Something Here" * | grep "$someVar"
<<Here it returns all rows with "someVar", not only those with "$someVar">>

我没有看到让grep不将字符串解释为正则表达式,而是将$作为另一个字符串字符包含在内的选项。


8
这个问题的主要问题不是关于grep$解释为正则表达式。而是关于shell用环境变量someVar的值(可能为空字符串)替换$someVar。第二个例子不应该返回所有带有“someVar”的行,而是所有行,因为空字符串在所有行中都存在。如果要告诉shell不进行替换,必须使用'$someVar'\$someVar。然后你需要处理grep$字符的解释。 - Christophe Drevet
1
@ChristopheDrevet-Droguet:感谢您的解释,我对这个downvote感到困惑!您的评论足够详细,可以作为一个答案,事实上,如果这样做,它将是页面上更好的答案之一。 - dotancohen
6个回答

358
使用fgrep(已弃用),grep -Fgrep--fixed-strings,使其将模式视为固定字符串列表,而不是正则表达式。
参考文档中提到(摘录):
 

-F --fixed-strings 将模式解释为固定字符串列表(而不是正则表达式),通过换行符分隔,任何一个都需要匹配。 (POSIX指定了-F。)

 

fgrepgrep-F 相同。 直接调用fgrep已经过时,但提供了允许依赖于它们的历史应用程序无修改地运行的功能。

要获取完整参考,请检查: https://www.gnu.org/savannah-checkouts/gnu/grep/manual/grep.html

同意-在使用变量时,您不能像PHP中的addslashes()那样在bash中对其进行操作。这是最简单的方法。 - geerlingguy
2
谢谢,这个有效。提醒:如果使用双引号,仍然需要转义$,例如: grep -FR "unset(\$foo['bar'])",否则它会认为它是一个外部变量并尝试扩展它。 - ᴍᴇʜᴏᴠ
如何使用换行符分割字符串? - Serge Rogatch

72

grep -F 是告诉 grep 将参数解释为固定字符串而不是模式的标准方式。


很好的答案。当我使用ssh命令搜索带有$符号的字符串时,它解决了我的问题。在那种情况下,用“\”转义无法正常工作。但是-F标志起了关键作用。 - Rajasekhar

10

你需要告诉 grep 你使用的是固定字符串,而不是模式,使用 '-F' 参数:

grep -ir "Something Here" * | grep -F \$somevar

7
在这个问题中,主要问题不在于grep$解释为正则表达式。而是关于shell用环境变量someVar的值(可能为空字符串)替换$someVar
因此,在第一个示例中,就像没有任何参数调用grep一样,这就是为什么它会给出usage输出的原因。第二个示例不应返回包含someVar的所有行,而是所有行,因为空字符串在所有行中都存在。
要告诉shell不进行替换,您必须使用'$someVar'\$someVar。然后,您必须处理$字符的grep解释,因此在许多其他答案中给出了grep -F选项。
因此,一个有效的答案是:
grep -ir "Something Here" * | grep '$someVar'

2

支持 -F 选项,它应该成为被接受的答案。同时,在我的文件中搜索 -I.. 模式时出现了“奇怪”的行为,因为 -I 被认为是 grep 的一个选项;为了避免这种错误,我们可以使用 -- 明确指定命令参数的结尾。

示例:

grep -HnrF -- <pattern> <files>

希望这能帮到某些人。

F代表什么? - Arnold Roa
从http://www.gnu.org/software/grep/manual/grep.html:-F:将模式解释为固定字符串列表(而不是正则表达式),由换行符分隔,其中任何一个都要匹配。 (POSIX指定了-F。) - Aloïké Go
如果使用了 --,那么 -HnrF 可以省略吗? - Daniel
@Daniel 这取决于你想做什么:-F 避免将模式解释为正则表达式,而 -- 避免将其后的元素解释为 grep 的选项。 - Aloïké Go
@AloïkéGo 谢谢,我明白了。 - Daniel

-5

$ 前加上 \ 来转义。


1
如果您花时间解释一下$的真正问题是与shell变量替换有关,而与grep无关,那么这个答案会更好。 - Dmitry Grigoryev
@DmitryGrigoryev 其他答案已经很好地解释了。我不认为通过修改我的答案能够添加什么内容。 - Mr Lister

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