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
答案 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。
)