Ack有时不会显示行号并丢失着色

奇怪在ack(betterthangrep.com) – 有时我得到一个行号,有时不是。

在第一个例子中,我在一些Python文件中寻找一个简单的短语。 它工作正常,并显示行号233.在第二个例子中,我寻找的第一列以'5'结束的所有行。

D:\DSWProj\2012L\src> perl D:\ack-standalone.pl "return True" *.py Volume5.py 233: return True D:\DSWProj\2012L\data\R123> perl D:\ack-standalone.pl "5 " NeedMoreCoffee_n5_*.data Volume5 FooData coffee_n5 2013-01-29 10:14 397125 0 0 1 0 397135 0 0 1 0 

这两行恰好是标题行之后文件的前两行。

为什么第二个例子中没有行号? 也没有打印文件名称,也没有着色。 Python的例子不会着色输出 – 行号是黄色的,文件名是绿色的。 (从上次我问的时候就感到惊讶,被告知Windows命令行shell根本无法着色。)这是ack还是Windows的怪癖? 除了在不同文件中明显search不同的东西之外,我在这两种情况下做了些什么不知情的事情?

运行在Windows 7 64位上,使用Strawberry Perl 5.16.2在两天前(2013年1月28日)下载,并且ack独立脚本1.96版也在两天前下载。

我相信奇迹*知道*.py文件是Python源代码,并将显示源代码文件的行数和着色,但不是像*.data这样的普通的旧数据文件。 这被认为是一个功能,而不是一个错误。

如果你想要一个可预测的,可组合的替代grep ,请尝试grep 。 ;)

* – 这当然不是很神奇, 它可以在.ackrc文件中配置。 运行ack --help-types获取更多信息。

编辑:我错了! 这不是因为.py.data之间的区别, 这是因为ack pattern f1ack pattern f1 f2 ...之间的区别。 在后一种情况下, ack将打印哪个文件f1 f2 ...包含匹配; 在前者(单个文件)的情况下, ack将表现得更像grep

为了欺骗生成行号,即使是单个文件,在行的末尾添加一个假文件。 对于Cygwin,你大概可以这样做

 perl D:\ack-standalone.pl "5 " NeedMoreCoffee_n5_*.data /dev/null 

对于Windows,也许这仍然有效:

 perl D:\ack-standalone.pl "5 " NeedMoreCoffee_n5_*.data NUL 

(这实际上是字母NUL,这是Windows如何拼写/dev/null ;另请参阅CON,LPT1等)。