Ack с регулярным выражением - путаница с простыми запросами - PullRequest
11 голосов
/ 18 июля 2011

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

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

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

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

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

РЕДАКТИРОВАТЬ: В моих тестах они выдают разные результаты (например, первый выводит больше совпадений, чем другие). Они также выделяют разные части одних и тех же линий.

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

1 Ответ

14 голосов
/ 18 июля 2011

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

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

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

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

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

This is a foo test.

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

...