如何用ack指定忽略模式?

时间:2014-08-31 09:12:16

标签: shell grep ack piping

我正在尝试搜索包含'foo'的行,但这些行不得包含'bar'。使用ack

搜索这些参数的好方法是什么?

我能做到:

ack "foo" | grep -v "bar"

但它没有保留ack的精美布局和彩色输出。另外,与grep不同,ack对Perl正则表达式没有很好的支持。

2 个答案:

答案 0 :(得分:5)

一种可能性是使用ack本身作为排除传递,并颠倒调用的顺序:

ack -v "bar" | ack "foo"

这至少会突出显示搜索字词,虽然它不会让您获得与ack "foo"完全相同的格式。

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

Multiple patterns with ack-grep?

ack '^(?!.*bar).*foo.*$'

这将为您提供ack的每个文件格式,但整行将突出显示为搜索字词。

答案 1 :(得分:5)

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

ack '^(?!.*bar).*(foo)' file

(?!...)做了一个负面的预测,以确保“栏”不在线上。以下是它的工作原理:

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

测试出来:

$ cat file
other foo bar
baz foo other
$ ack '^(?!.*bar).*(foo)' file
baz foo other
相关问题