【问题标题】:Quotes when using grep?使用 grep 时的引号?
【发布时间】:2011-03-01 19:22:45
【问题描述】:

Grep 的行为会有所不同,具体取决于我在正则表达式周围使用的引号类型。我似乎无法清楚地理解为什么会这样。这是一个问题的例子:

hamiltont$ grep -e show\(  test.txt 
  variable.show();
  variable.show(a);
  variable.show(abc, 132);
  variableshow();
hamiltont$ grep -e "show\("  test.txt 
grep: Unmatched ( or \(
hamiltont$ grep -e 'show\('  test.txt 
grep: Unmatched ( or \(

我只是假设有一些适当的方法可以用单/双引号将正则表达式括起来。有什么帮助吗?

FWIW,grep --version 返回grep (GNU grep) 2.5.1

【问题讨论】:

    标签: regex grep quotes


    【解决方案1】:

    我不相信 grep 的行为不同,它是外壳。我假设你正在使用 bash

    http://www.faqs.org/docs/bashman/bashref_8.html

    基本上,引用的版本在斜杠上的行为不同,具体取决于引用机制。

    引用的两个示例都可以在没有斜杠的情况下工作。对于第一个,shell 将转义 ( 并将 just show( 传递给模式的 grep。

    【讨论】:

      【解决方案2】:

      包含参数的命令行在执行之前由 shell 处理。您可以使用 echo 来查看 shell 的作用:

      $ echo grep -e show\(  test.txt 
      grep -e show( test.txt
      
      $ echo grep -e "show\("  test.txt 
      grep -e show\( test.txt
      
      $ echo grep -e 'show\('  test.txt 
      grep -e show\( test.txt
      

      因此,如果没有引号,反斜杠将被删除,使“(”成为 grep 的普通字符(grep 默认使用 basic 正则表达式,使用 -E 使 grep 使用 extended正则表达式)。

      【讨论】:

      • 我还是不明白单引号和双引号有什么区别。在您发布的示例中,他们似乎做同样的事情。
      • 如果我有一个 grep 正则表达式应该匹配单引号或双引号,我该如何用 grep 编写它? grep '["]\'" 似乎不起作用...
      • 单引号和双引号对我们的目的是一样的。要匹配引号,只需使用 " 或 '。如果将模式括在引号中,请使用与要匹配的不同的引号,例如,在模式中匹配 " 将是 'foo"bar'
      • 对于模式内的两种类型的引号,请在外部命令周围使用单引号并使用 \' 转义,请参阅unix.stackexchange.com/questions/23347/…
      【解决方案3】:

      引号改变了 grep 看到的内容。未引用形式的反斜杠 (\) 由 shell 处理,shell 将反斜杠后面的字符视为特殊字符。这发生在 grep 获取参数之前。 grep 看到 show(。当使用引号(单引号或双引号)时,shell 将它们解释为“不理会内容”,因此 grep 看到 show\( 并且\( 字符在 grep 中有意义,它正在寻找右括号 - \)。

      顺便说一句:单引号和双引号处理在 shell 处理 shell 变量的方式上是不同的,但是您的示例中没有 shell 变量。

      【讨论】:

        【解决方案4】:

        按顺序:

        grep -e show( test.txt
        

        不起作用,因为 shell 将 ( 解释为特殊的括号,而不仅仅是字符,并且找不到结束的 )

        这两个都有效:

        grep -e 'show(' test.txt
        grep -e "show(" test.txt
        

        因为 shell 将引用的文本视为文本,并将其传递给 grep。

        这些不起作用:

        grep -e 'show\(' test.txt
        grep -e "show\(" test.txt
        

        因为 shell 将 show\( 传递给 grep,所以 grep 将 \( 视为特殊的,一个括号,而不仅仅是一个字符,并且找不到结束的 \)

        【讨论】:

          猜你喜欢
          • 2011-10-20
          • 2014-09-28
          • 1970-01-01
          • 1970-01-01
          • 2011-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多