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

我可以:
ack "foo" | grep -v "bar"
但它不会保留ack的布局和彩色输出效果。另外,与grep不同,ack对Perl regexes也没有很好的支持。

最佳答案

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

ack '^(?!.*bar).*(foo)' file
(?!...)进行否定的前瞻,以确保“bar”不在行中。运作方式如下:
  • ^从行的开头开始。
  • (?!.*bar)前进任意数量的字符,直到找到“bar”。如果找到,请勿继续。否则,请返回该行的开头并继续。
  • .*(foo)在行的开头和结尾之间的任意点匹配(并捕获)“foo”。

  • 测试一下:
    $ cat file
    other foo bar
    baz foo other
    $ ack '^(?!.*bar).*(foo)' file
    baz foo other
    

    关于shell - 如何用ack指定忽略模式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25590532/

    10-13 07:15