Regex 使用grep时使用引号?

Regex 使用grep时使用引号?,regex,grep,quotes,Regex,Grep,Quotes,Grep的行为有所不同,这取决于我在regex中使用了什么样的引号。我似乎不明白为什么会这样。以下是问题的一个示例: 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 \( hamilto

Grep的行为有所不同,这取决于我在regex中使用了什么样的引号。我似乎不明白为什么会这样。以下是问题的一个示例:

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

我不认为是grep表现不同,而是shell。我假设您正在使用bash

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


如果没有斜杠,两个引用的示例都会起作用。对于第一个命令行,shell将转义(并将just show)传递给模式的grep。

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

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

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

顺序:

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

我仍然不明白单引号和双引号之间的区别。在您发布的示例中,它们似乎做了相同的事情。如果我有一个应该匹配单引号或双引号的grep正则表达式,我如何使用grep编写它?
grep'[“]\'”
似乎不起作用…单引号和双引号对我们的目的来说是一样的。要匹配引号,只需使用“或”。如果在引号中围绕模式,请使用与您要匹配的引号不同的引号,例如,模式中的“匹配”将是“foo”“bar”对于模式内的两种类型的引号,在外部命令周围使用单引号,并使用\'see'转义