我正在尝试搜索包含“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/