2011-07-18 48 views
8

我想使用ack-is-better-than-grep(ACK)正则表达式找到我的代码库线和片段。我的理解是,ack使用Perl-derivative regular expressions,这是正确的吗?确认与正则表达式 - 混淆,简单的查询

但是,我不知道如何将这些查询工作:

ack 'foo' 
ack '.*(foo)+.*' 

ack '.*foo' 
ack 'foo.*' 

难道他们给不同的输出?如果是这样,为什么?

编辑:在我的测试中,他们输出不同的结果(例如,第一个输出比其他结果更匹配)。他们还突出了同一行的不同部分。

编辑2:输出的差异显然与突出显示(输出的着色)有关。我注意到,如果我运行ack--nocolor上述命令的输出是相同的。显然,使用默认着色运行ack会使部分输出在我的机器/配置中不可见。我在Ubuntu 11.04中使用bash在GNOME终端上运行它。

+0

*不要*这些疑问给出不同的输出?如果是这样,你能举个例子吗?否则,你有什么理由怀疑他们这样做? –

+0

你是什么意思第一个输出更多的比赛?哪一行匹配1,但没有匹配其他行? – NorthGuard

+0

感谢@Konrad和@inTide,我更新了问题以解决您的意见。 –

回答

10

我的理解是ack使用Perl派生正则表达式,这是正确的吗?

是的。事实上,ack用Perl编写,只是转发表情内部发动机。

难道他们给不同的输出?如果是这样,为什么?

表达应该发现相同的结果。然而,输出,因为ack仍可能有所不同允许语法高亮显示其输出(默认情况下,除非--nocolor指定) - 它采用ANSI转义符来输出彩色命中,显然'foo'将突出起来比'.*foo'不同的东西(和其他查询)。

也就是说,在下面的输入:

This is a foo test. 

'foo'查询将突出这一点:“foo”,而'.*foo'将突出“This is a foo”。

+0

感谢@Konrad,它解释了突出显示的差异。但是我得到了不同的输出,但是当我使用'--nocolor'选项运行它们时,它们输出的结果相同。我认为问题在于某些输出中的ANSI转义代码存在问题,导致匹配不可见(其中一些输出中有黑色空间) –