我怎样才能在bash中正确地逃避这个正则表达式?

时间:2012-01-10 02:24:21

标签: regex bash grep escaping quoting

我正在尝试使用以下正则表达式运行grep:

(?<!key:)(?<!orKey:)(?<!isEqualToString:)\@\"[A-Za-z0-9]*\"

首先尝试:

$ grep -r -n  -H -E (?<!key:)(?<!orKey:)(?<!isEqualToString:)\@\"[A-Za-z0-9]*\" ./
    -bash: !key: event not found

好的,所以我需要逃避“!”s ......

$ grep -r -n  -H -E (?<\!key:)(?<\!orKey:)(?<\!isEqualToString:)\@\"[A-Za-z0-9]*\" ./
    -bash: syntax error near unexpected token `('

好的,所以我需要逃避“(”s ...

$ grep -r -n  -H -E \(?<\!key:\)\(?<\!orKey:\)\(?<\!isEqualToString:\)\@\"[A-Za-z0-9]*\" ./
    -bash: !key:)(?: No such file or directory

好的,所以我需要引用字符串?

$ grep -r -n  -H -E '\(?<\!key:\)\(?<\!orKey:\)\(?<\!isEqualToString:\)\@\"[A-Za-z0-9]*\"' ./

返回没有结果...但是我尝试了一个更简单的正则表达式,它没有负面后瞻断言,并且它运行良好...我也使用TextWrangler与这个正则表达式它确实有效,所以我可以我假设我在命令行上做错了。

编辑:

如果我使用-p选项:

$ grep -r -n  -H -E -P '\(?<\!key:\)\(?<\!orKey:\)\(?<\!isEqualToString:\)\@\"[A-Za-z0-9]*\"' ./
grep: conflicting matchers specified

应匹配的文件内容示例:

NSString * foo = @"bar";

不应匹配的文件内容示例:

return [someDictonary objectForKey:@"foo"];

4 个答案:

答案 0 :(得分:5)

在核心部分,您需要使用''引用整个字符串。 (如果你用""括起来,!会让你感到悲伤。然后,您只需要在正则表达式中转义内部'(如果有的话)。

您也希望-P(perl)代替-E(egrep)正则表达式。

grep -r -n -H -P '(?<!key:)(?<!orKey:)(?<!isEqualToString:)\@\"[A-Za-z0-9]*\"' ./

答案 1 :(得分:4)

尝试使用 -P 选项,它将正则表达式解释为perl正则表达式。此外,如果您提供一些示例输入和输出,它将有助于获得答案。

答案 2 :(得分:2)

只要表达式中没有'

'引用就会完美无缺。你没有,所以应该没事。

如果您对引用非常偏执,请将表达式放在文件中,然后使用grep -f FILENAME,以便从文件中读取正则表达式。

但真正的问题可能是你需要指定grep -P来明确要求Perl正则表达式支持。

答案 3 :(得分:0)

它工作正常,只是避免使用冲突的选项。 -

[jaypal:~/Temp] cat filename
NSString * foo = @"bar";
return [someDictonary objectForKey:@"foo"];

[jaypal:~/Temp] grep -P '(?<!key:)(?<!orKey:)(?<!isEqualToString:)\@\"[A-Za-z0-9]*\"' filename
NSString * foo = @"bar";