使用grep时引用?

时间:2010-06-09 17:52:36

标签: regex grep quotes

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

4 个答案:

答案 0 :(得分:25)

包含参数的命令行在执行之前由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使用扩展正则表达式)。

答案 1 :(得分:3)

按顺序:

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将\(视为特殊,括号,而不仅仅是一个字符,并且无法找到结束\)

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

我不相信它是表现不同的grep,它是shell。我假设你正在使用bash

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

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

两个引用的示例都可以在没有斜线的情况下工作。对于第一个,shell会逃逸(并传入刚显示(到模式的grep。