我正在尝试搜索包含'foo'的行,但这些行不得包含'bar'。使用ack
?
我能做到:
ack "foo" | grep -v "bar"
但它没有保留ack
的精美布局和彩色输出。另外,与grep
不同,ack
对Perl正则表达式没有很好的支持。
答案 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