2

我希望 grep 的输出类似于:

path/filename1-
line1
match
line3
--
path/filename2-
line1
match
line3

如果我这样做,grep -h -C 3 match file我会接近,但没有文件名。从手册页我看不到任何其他选项。

4

2 回答 2

1

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”。

于 2013-03-18T03:22:19.427 回答
1

我不认为你可以直接用 grep 做到这一点。您也许可以编写一个包装器,也许可以使用 sed 来做到这一点。如果您使用该-Z标志,则 grep 会将文件名与匹配的部分分开(因此也用于-H获取文件名)。然后也许跟踪当前文件名,当它改变时打印出来,然后换行,否则只是从匹配行的前面删除它。想想看,perl 也可以

于 2013-03-18T03:12:44.680 回答