我希望 grep 的输出类似于:
path/filename1-
line1
match
line3
--
path/filename2-
line1
match
line3
如果我这样做,grep -h -C 3 match file
我会接近,但没有文件名。从手册页我看不到任何其他选项。
ack 正是这样做的。
$ ack get -C3
unuse
7-
8-my $url = shift || die 'specify a URL';
9-
10:$mech->get( $url );
11-
12-my $text = $mech->content;
13-
whack
47- Note that this script uses PPI and works only on perl
48- scripts, modules, tests, etc. PPI takes a bit of time
49- too, so if running this on an entire large repo, you
50: may want to multitask or get some coffee.
51-
52- By default, searches recursively for perl files in . and
53- identifies the subroutine most likely to invoke confusion
另外,请注意,虽然这里没有显示,但输出是彩色编码的。文件名(本例中的“unuse”和“whack”)为绿色,行号为黄色,匹配的字符串为反黄色。
ack 是一个类似于 grep 的搜索工具,专门针对程序员。它可以在http://betterthangrep.com获得,许多 *nix 发行版都将它作为一个包提供。Debian 派生的软件包将 ack 打包为“ack-grep”。
我不认为你可以直接用 grep 做到这一点。您也许可以编写一个包装器,也许可以使用 sed 来做到这一点。如果您使用该-Z
标志,则 grep 会将文件名与匹配的部分分开(因此也用于-H
获取文件名)。然后也许跟踪当前文件名,当它改变时打印出来,然后换行,否则只是从匹配行的前面删除它。想想看,perl 也可以