2

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 的怪癖?除了在不同文件中明显搜索不同的东西之外,我是否在这两种情况下不知不觉地做了一些不同的事情?

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

4

1 回答 1

3

我相信ack神奇地*知道*.py文件是 Python 源代码,并且会显示源代码文件的行号和颜色,但不会显示*.data. 这被认为是一项功能,而不是错误。

如果您想要一个可预测的、可组合的替代品grep,请尝试grep. ;)

* – 当然,这并不是真正的魔法;它可以在您的.ackrc文件中配置。运行ack --help-types以获取更多信息。

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

为了欺骗ack即使是为单个文件也生成行号,请在行尾添加一个假文件。对于 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 等)。

于 2013-02-01T00:47:21.450 回答