Grep不是正则表达式


96

我需要搜索一个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不要将字符串解释为正则表达式的选项,而是包含$为另一个字符串字符。


3
在这个问题中,主要问题不在于grep解释$为正则表达式。这是关于$someVar用环境变量someVar(可能是空字符串)的值替换外壳的情况。第二个示例不应返回仅包含所有行的someVar所有行,因为所有行中都包含空字符串。要告诉Shell不替代它,您必须使用'$someVar'\$someVar。然后,您将不得不处理角色的grep解释$
Christophe Drevet-Droguet '16

1
@ ChristopheDrevet-Droguet:谢谢您的解释,我对投票失败感到困惑!您的评论足以提供答案,实际上,如果是的话,它将是页面上更好的答案之一。
dotancohen

Answers:



298

使用fgrep(已弃用),grep -Fgrep --fixed-strings,使其将模式视为固定字符串列表而不是正则表达式。

作为参考,文档中提到(摘录):

-F --fixed-strings将模式解释为固定字符串列表(而不是正则表达式),并用换行符分隔,其中的任何一个都将被匹配。(-F由POSIX指定。)

fgrep与相同grep -F。不建议使用直接调用fgrep,但提供该功能是为了允许依赖它们的历史应用程序不经修改地运行。

有关完整的参考,请检查:https : //www.gnu.org/savannah-checkouts/gnu/grep/manual/grep.html


简单的好答案。
Breadmj

同意-使用变量时,您无法addslashes()在bash中对其执行类似PHP的操作。这是最简单的方法。
geerlingguy

1
谢谢你,这个工作。提醒:如果使用双引号,您仍然必须转义$,例如:grep -FR "unset(\$foo['bar'])",否则它会认为这是一个外部变量,并尝试对其进行扩展
aexl

57

grep -F是一种grep用于将参数解释为固定字符串而不是模式的标准方法。


1
说真的,这应该是公认的答案!
ankush981

好答案。当我使用ssh命令用$搜索字符串时,它解决了我的问题。在这种情况下,不能使用“ \”转义。但是-F标志起到了作用。
Rajasekhar

8

您必须告诉grep您使用固定字符串而不是模式,使用'-F':

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

3

在这个问题中,主要问题不在于grep解释$为正则表达式。这是关于$someVar用环境变量someVar(可能是空字符串)的值替换外壳的情况。

因此,在第一个示例中,就像grep没有任何参数的调用一样,这就是为什么它为您提供usage输出的原因。第二个示例不应返回仅包含所有行的someVar所有行,因为所有行中都包含空字符串。

要告诉Shell不替代它,您必须使用'$someVar'\$someVar。然后,您将不得不处理$字符的grep解释,因此grep -F在许多其他答案中都提供了该选项。

因此,一个有效的答案是:

grep -ir "Something Here" * | grep '$someVar'

2

+1为-F选项,应为接受的答案。另外,-I..在我的文件中搜索模式时,我有一个“奇怪”的行为,因为可以将-I其视为的选项grep。为避免此类错误,我们可以使用以下命令显式指定命令参数的结尾--

例:

grep -HnrF -- <pattern> <files>

希望能帮助到某人。


F代表什么?
Arnold Roa

gnu.org/software/grep/manual/grep.html中:“ -F:将模式解释为固定字符串列表(而不是正则表达式),并以换行符分隔,其中任何换行符都应匹配。(-F由POSIX指定)。”
Aloïké转到

如果--使用,可以-HnrF省略吗?
丹尼尔(Daniel)

@Daniel这取决于您要执行的操作:-F避免将模式解释为正则表达式,而--避免将其后的元素解释为grep选项。
Aloïké转到

@AloïkéGo谢谢,我明白了。
丹尼尔(Daniel)
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.