【问题标题】:Grep not as a regular expressiongrep 不作为正则表达式
【发布时间】:2012-02-23 15:48:53
【问题描述】:

我需要搜索一个 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 将字符串解释为正则表达式的选项,而是将 $ 包含为另一个字符串字符。

【问题讨论】:

  • 在这个问题中,主要问题不是grep$ 解释为正则表达式。这是关于用环境变量someVar 的值替换$someVar 的shell,可能是空字符串。第二个示例不应返回带有someVar 的所有行,而是返回所有行,因为空字符串在所有行中。要告诉外壳不要替换,您必须使用'$someVar'\$someVar。然后你必须处理grep$ 字符的解释。
  • @ChristopheDrevet-Droguet:感谢您的解释,我对否决票感到困惑!您的评论提供的信息足以作为答案,事实上,如果是这样,它将是页面上更好的答案之一。

标签: linux grep


【解决方案1】:

使用fgrep(已弃用)、grep -Fgrep --fixed-strings,使其将模式视为固定字符串列表,而不是正则表达式。

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

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

fgrepgrep -F 相同。直接调用 fgrep 是 已弃用,但提供它是为了允许依赖的历史应用程序 让它们在未经修改的情况下运行。

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

【讨论】:

  • 同意——当您使用变量时,您不能在 bash 中对它执行 PHP 的 addslashes() 之类的操作。这是最简单的方法。
  • 谢谢,这成功了。提醒:如果使用双引号,你仍然需要转义$,例如:grep -FR "unset(\$foo['bar'])",否则它认为它是一个外部变量并尝试扩展它
【解决方案2】:

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

【讨论】:

  • 不错的答案。当我使用 ssh 命令使用 $ 搜索字符串时,它解决了我的问题。在那种情况下,用“\”转义不起作用。但是 -F 标志成功了。
【解决方案3】:

你必须告诉 grep 你使用一个固定字符串,而不是一个模式,使用 '-F' :

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

【讨论】:

    【解决方案4】:

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

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

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

    所以一个有效的答案是:

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

    【讨论】:

      【解决方案5】:

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

      例子:

      grep -HnrF -- <pattern> <files>
      

      希望对某人有所帮助。

      【讨论】:

      • F 代表什么?
      • 来自gnu.org/software/grep/manual/grep.html : "-F : 将模式解释为固定字符串列表(而不是正则表达式),由换行符分隔,其中任何一个都将被匹配。(指定了-F通过 POSIX。)”
      • 如果使用--,可以省略-HnrF吗?
      • @Daniel 这取决于你想做什么:-F 避免将模式解释为正则表达式,而-- 避免将其后面的元素解释为 grep 的选项。
      • @AloïkéGo 谢谢,我明白了。
      【解决方案6】:

      通过在$ 前面放置\ 来避开$

      【讨论】:

      • 如果您花时间解释$ 的真正问题是与grep 无关的shell 变量替换,这个答案会好得多。
      • @DmitryGrigoryev 其他答案已经很好地解释了。我看不出我可以通过修改自己的答案来添加什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2016-08-16
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 2011-05-13
      相关资源
      最近更新 更多