Linux Grep不是正则表达式

Linux Grep不是正则表达式,linux,grep,Linux,Grep,我需要搜索一个PHP变量$someVar。然而,Grep认为我正在尝试运行regex,并抱怨: $ 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 al

我需要搜索一个PHP变量
$someVar
。然而,Grep认为我正在尝试运行regex,并抱怨:

$ 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-ir“某物在这里”*| grep$someVar
用法:grep[选项]。。。模式[文件]。。。
有关详细信息,请尝试“grep--help”。
$grep-ir“某物在这里”*| grep“$someVar”

我看不出有什么办法可以告诉grep不要将字符串解释为正则表达式,而是将
$
作为另一个字符串包含进去。

通过在
\
前面放一个
\
来对
$
进行转义。

使用
fgrep
(已弃用)、
grep-F
grep--固定字符串
,要使它将模式视为固定字符串的列表,而不是正则表达式

为了便于参考,文件中提到(摘录):

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

fgrep
grep-F
相同。像fgrep一样直接调用 已弃用,但提供此选项是为了允许依赖 让它们在未修改的情况下运行

有关完整的参考,请检查:

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

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

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

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

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

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

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

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

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

例如:

grep -HnrF -- <pattern> <files>
grep-HnrF--

希望这能帮助别人。

说真的,这应该是公认的答案!回答得好。它解决了我在使用ssh命令搜索带有$的字符串时遇到的问题。在那种情况下,用“\”转义不起作用。但是-F flag起了作用。在这个问题中,主要的问题不是将
grep
解释为正则表达式。这是关于shell用环境变量
someVar
的值替换
$someVar
,很可能是空字符串。第二个示例不应返回带有
someVar
的所有行,而是返回所有行,因为空字符串位于所有行中。要告诉shell不要替换,必须使用
'$someVar'
\$someVar
。然后你必须处理
grep
$
字符的解释。@ChristopheDrevet Droguet:谢谢你的解释,我对否决票感到困惑!您的评论信息丰富,足以作为答案,事实上,如果是这样,它将是页面上更好的答案之一。F代表什么?From:“-F:将模式解释为固定字符串(而不是正则表达式)的列表,由新行分隔,其中任何一行都要匹配。(-F由POSIX指定。)”如果使用
--
-HnrF
可以省略吗?@Daniel这取决于您想做什么:
-F
避免将模式解释为正则表达式,而
--
避免将模式后面的元素解释为grep的选项。@AloïkéGo谢谢,我明白了。简单的很好的答案。同意-当您使用变量时,您不能在bash中对其执行类似PHP的
addslashes()
的操作。这是最简单的方法。谢谢,这很有效。提醒:如果使用双引号,您仍然必须转义
$
,例如:
grep-FR“unset(\$foo['bar')”
,否则,它会认为这是一个外部变量,并试图扩展它。如果你花时间解释一下,
$
的真正问题是shell变量替换,它与
grep
@dmitrygrioyev无关,那么这个答案会更好。其他答案已经做了很好的解释。我看不出我可以通过修改自己的答案来补充什么。