Grep不是正则表达式

时间:2012-02-23 15:48:54

标签: linux grep

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

6 个答案:

答案 0 :(得分:240)

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

供参考,文件提及(摘录):

  

-F --fixed-strings将模式解释为已修复的列表   字符串(而不是正则表达式),由换行符分隔,任何   其中有待匹配。 (-F由POSIX指定。)

     

fgrepgrep -F相同。直接调用fgrep是   不推荐使用,但提供的是允许依赖的历史应用程序   对他们进行未经修改的运行。

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

答案 1 :(得分:52)

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

答案 2 :(得分:8)

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

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

答案 3 :(得分:1)

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

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

要告诉shell不能替换,您必须使用'$someVar'\$someVar。然后,您将不得不处理$字符的grep解释,因此在许多其他答案中给出了grep -F选项。

所以一个有效的答案是:

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

答案 4 :(得分:1)

+1 -F选项,它应该是接受的答案。 而且,我有一个&#34;奇怪的&#34;在我的文件中搜索-I..模式时的行为,因为-I被视为grep的选项;为了避免这种错误,我们可以使用--显式指定命令参数的结尾。

示例:

grep -HnrF -- <pattern> <files>

希望能帮助别人。

答案 5 :(得分:0)

通过在$前放置\来逃离{{1}}。