4

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

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

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

好的,所以我需要转义“(”...

$ 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

4 回答 4

5

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

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

grep -r -n -H -P '(?<!key:)(?<!orKey:)(?<!isEqualToString:)\@\"[A-Za-z0-9]*\"' ./
于 2012-01-10T02:41:33.280 回答
4

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

于 2012-01-10T02:29:36.817 回答
2

'只要'您的表达中没有引用,引用就可以完美地工作。你没有,所以应该没问题。

如果您真的对引用感到偏执,请将表达式放在文件中并grep -f FILENAME改为使用,以便它从文件中读取正则表达式。

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

于 2012-01-10T02:46:06.217 回答
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";
于 2012-01-10T02:48:57.447 回答