我正在寻找一个类的实例,除了导入之外说Foo
。也就是说,匹配应该如下。
import com.acme.Foo; // Does not match
...
import com.acme.FooBar; // Does not match
...
static Foo FOO = new Foo(); // matches
...
Foo f = new Foo(); // matches
FooBar.newFoo(); // matches
我想这可以用perl regexp和负面的lookbehind完成吗?我不知道perl,所以我使用的是grep --perl-regexp
,但无法弄明白,主要是因为我也不太了解perl regexps。我只能想出以下内容,但两者都不起作用:
grep --perl-regexp -nH '(?<!import ).*Foo' t #matches all lines
grep --perl-regexp -nH '(?<!import .*)Foo' t #error: lookbehind assertion is not fixed length
我也很乐意使用perl,只要使用确切的命令。
编辑:顺便说一下,有趣的是,perl的答案来自具有相当神秘和简洁名称的用户 - hwnd和zx81:)
答案 0 :(得分:1)
使用Negative Lookahead,而不是使用负面反对。
grep -P '^(?!.*import).*Foo' t
或者你可以使用Perl单行。
perl -ne 'print if /^(?!.*import).*Foo/' t
答案 1 :(得分:1)
使用您当前的输入,您可以使用:
grep -oP "^(?!.*import).*new ?\KFoo()" your path
仅匹配Foo
。
如果你想要整条线,
grep -P "^(?!.*import).*new ?Foo()" your path
答案 2 :(得分:1)
为什么不使用两个grep
s:
grep "Foo" file(s) | grep -v "import"