如何用ack指定忽略模式?

DBe*_*nko 3 shell grep piping ack

我正在尝试搜索包含'foo'的行,但这些行不能包含'bar'.使用这些参数进行搜索的好方法是ack什么?

我可以:

ack "foo" | grep -v "bar"

但它并没有保持良好的布局和彩色输出ack.另外,grep与Perl正则表达式相比,它没有很好的支持ack.

Tom*_*ech 6

您可以使用稍微复杂一些的正则表达式:

ack '^(?!.*bar).*(foo)' file
Run Code Online (Sandbox Code Playgroud)

(?!...)做了负前瞻,以确保“吧”是不是就行了。运作方式如下:

  • ^ 从行的开头开始。
  • (?!.*bar)前进任意数量的字符,直到找到“ bar”。如果找到,请勿继续。否则,请返回该行的开头并继续。
  • .*(foo) 在行的开头和结尾之间的任意点匹配(并捕获)“ foo”。

测试一下:

$ cat file
other foo bar
baz foo other
$ ack '^(?!.*bar).*(foo)' file
baz foo other
Run Code Online (Sandbox Code Playgroud)


jcl*_*jcl 5

一种可能性是将ack自身用于排除传递,并颠倒调用的顺序:

ack -v "bar" | ack "foo"
Run Code Online (Sandbox Code Playgroud)

这至少会突出显示搜索词,虽然它不会让你得到完全相同的格式ack "foo".

另一种可能性是将两个术语组合在同一个正则表达式中,使用排除术语的否定前瞻,如下面的答案所示:

使用ack-grep的多个模式?

ack '^(?!.*bar).*foo.*$'
Run Code Online (Sandbox Code Playgroud)

这将获得您ack的每个文件格式,但整行将突出显示为搜索词.