Ack с регулярным выражением - путаница с простыми запросами

Я пытаюсь использовать ack-is-better-than-grep (ack) с регулярными выражениями для поиска строк и фрагментов в моем репозитории кода. Насколько я понимаю, ack использует регулярные выражения, производные от Perl, это правильно?

Однако я не уверен, как будут работать эти запросы:

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

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

Могут ли они давать разные результаты? Если да, то почему?

EDIT: В моих тестах они выводят разные результаты (например, первый выводит больше совпадений, чем другие). Они также выделяют разные части одних и тех же линий.

EDIT 2: Разница в выводе, по-видимому, связана с выделением (окрашиванием вывода). Я заметил, что если я запускаю ack с --nocolor, вывод приведенных выше команд будет таким же. По-видимому, запуск ack с раскраской по умолчанию делает часть вывода невидимой в моей машине/конфигурации. Я запускаю его на терминале GNOME из bash в Ubuntu 11.04.


person Amelio Vazquez-Reina    schedule 18.07.2011    source источник
comment
Дают ли эти запросы разные результаты? Если да, то не могли бы вы привести пример? В противном случае, каковы ваши основания подозревать, что они это делают?   -  person Konrad Rudolph    schedule 18.07.2011
comment
Что вы имеете в виду, говоря, что первый выводит больше совпадений? Какие строки совпадают с 1, но не совпадают с другими?   -  person NorthGuard    schedule 18.07.2011
comment
Спасибо @Konrad и @inTide, я обновил вопрос, чтобы учесть ваши комментарии.   -  person Amelio Vazquez-Reina    schedule 19.07.2011


Ответы (1)


Насколько я понимаю, ack использует производные от Perl регулярные выражения, верно?

да. На самом деле ack написан на Perl и просто пересылает выражения во внутренний движок.

Могут ли они давать разные результаты? Если да, то почему?

Выражения должны найти одинаковые результаты. Тем не менее, вывод может все же отличаться, поскольку ack позволяет подсвечивать синтаксис в своем выводе (по умолчанию; если не указано --nocolor) — он использует escape-коды ANSI для выделения совпадений в выводе, и, очевидно, 'foo' будет выделять что-то отличное от '.*foo' (и другие запросы).

А именно, в следующем вводе:

This is a foo test.

запрос для 'foo' выделит именно это: «foo», а '.*foo' выделит «This is a foo».

person Konrad Rudolph    schedule 18.07.2011
comment
Спасибо @Konrad, это объясняет различия в выделении. Однако я получаю для них разные результаты, НО когда я запускаю их с опцией --nocolor, они выводят один и тот же результат. Я думаю, проблема в том, что есть проблема с escape-кодами ANSI в некоторых выходных данных, что делает сопоставления невидимыми (для некоторых из них в выходных данных есть черное пространство) - person Amelio Vazquez-Reina; 19.07.2011