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指定)
fgrep
与grep -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式。 这是关于用$someVar
replace环境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>
希望能帮助别人。