grep表示行不以另一个模式开头的模式

时间:2014-07-17 03:17:02

标签: regex grep

我正在寻找一个类的实例,除了导入之外说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:)

3 个答案:

答案 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"