Grep不是一个正则expression式

我需要search一个PHPvariables$someVar 。 但是,Grep认为我正在尝试运行一个正则expression式,并抱怨:

 $ 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 不要将string解释为正则expression式的选项,而是将$作为另一个string字符。

通过在其前面放置一个\来摆脱$

使用fgrep (不build议使用), grep -F或者grep --fixed-strings ,把它作为固定string列表,而不是正则expression式。

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

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

fgrepgrep -F相同。 作为fgrep的直接调用被弃用,但被提供来允许依赖它们的历史应用程序不被修改地运行。

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

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

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

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

在这个问题中,主要的问题不在于将grep解释为正则expression式。 这是关于用$someVarreplace环境variablessomeVar的值,可能是空string。

所以在第一个例子中,就像调用grep没有任何参数,这就是为什么它给你一个usage输出。 第二个例子不应该返回所有包含someVar但包含所有行的行,因为空string在所有行中。

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

所以一个有效的答案是:

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

+1为-F选项,它应该是被接受的答案。 另外,在我的文件中search-I..模式时,我有一个“奇怪的”行为,因为-I被认为是grep一个选项; 为了避免这样的错误,我们可以使用--明确地指定命令参数的结尾。

例:

 grep -HnrF -- <pattern> <files> 

希望能帮助别人。