Использование ACK в качестве фильтра - PullRequest
2 голосов
/ 21 октября 2011

Я использовал ACK для поиска в моей базе кода, и это замечательный инструмент. Однако у него есть (на мой взгляд) одно важное ограничение - оно не позволяет многострочное сопоставление регулярных выражений.

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

ack -l --type=java "(List|Collection|Map|Set)" | ack --type=java "String"

И я бы предпочел не использовать grep, так как я хочу ограничить свои поиски файлами java, игнорируя .cvs dirs, .svn dirs и т. Д. (Что-то ack делает по умолчанию) Любые идеи?

1 Ответ

4 голосов
/ 21 октября 2011

Ваша текущая командная строка выполняет ack в списке файлов, не используя список сопоставленных файлов в качестве другого набора файлов для проверки. То есть это было бы так же, как делать

ack -l --type=java "(List|Collection|Map|Set)" > files
ack "String" files

xargs - это инструмент, который вы хотите использовать для обработки вывода первой команды как набора файлов, с которыми может выполняться второй вызов ack.

ack --print0 -l --type=java "(List|Collection|Map|Set)" | xargs -0 ack "String"

--print0 разделяет имена файлов нулевыми символами, чтобы гарантировать, что xargs получит правильное имя файла (если в нем есть нечетные символы). Флаг -0 для xargs указывает на то, что имена файлов будут разделены нулями.

...