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

Ste*_*eve 4 regex bash grep escaping quoting

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

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

第一次尝试:

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

好的,所以我需要逃避"!"的...

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

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

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

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

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

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

编辑:

如果我使用-p选项:

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

应匹配的文件内容示例:

NSString * foo = @"bar";
Run Code Online (Sandbox Code Playgroud)

不匹配的文件内容示例:

return [someDictonary objectForKey:@"foo"];
Run Code Online (Sandbox Code Playgroud)

mat*_*fee 5

在它的核心,你需要引用整个字符串''.(如果您有附上""!会给你悲伤).然后你只需要'在你的正则表达式内部转义(如果有的话).

你也想要-P(perl)而不是-E(egrep)正则表达式.

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