您可以使用稍微复杂一些的正则表达式:
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)
一种可能性是将ack自身用于排除传递,并颠倒调用的顺序:
ack -v "bar" | ack "foo"
Run Code Online (Sandbox Code Playgroud)
这至少会突出显示搜索词,虽然它不会让你得到完全相同的格式ack "foo".
另一种可能性是将两个术语组合在同一个正则表达式中,使用排除术语的否定前瞻,如下面的答案所示:
ack '^(?!.*bar).*foo.*$'
Run Code Online (Sandbox Code Playgroud)
这将获得您ack的每个文件格式,但整行将突出显示为搜索词.