我需要搜索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 不将字符串解释为正则表达式的选项,而是将$
包含为另一个字符串字符。
答案 0 :(得分:240)
使用fgrep
(已弃用),grep -F
或grep --fixed-strings
,将模式视为固定字符串列表,而不是正则表达式。
供参考,文件提及(摘录):
-F
--fixed-strings
将模式解释为已修复的列表 字符串(而不是正则表达式),由换行符分隔,任何 其中有待匹配。 (-F由POSIX指定。)
fgrep
与grep -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}}。