Linux Grep不是正则表达式
我需要搜索一个PHP变量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
$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无关,那么这个答案会更好。其他答案已经做了很好的解释。我看不出我可以通过修改自己的答案来补充什么。