我正在尝试使用以下正则表达式运行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"];
答案 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";