Ack: исключить определенные каталоги из поиска через регулярное выражение
Как игнорировать определенные каталоги через RegEx с помощью ack?
Я могу использовать параметр --ignore-dir
, но это не позволяет мне указывать RegEx. Я хочу иметь возможность игнорировать любой каталог, в котором есть слова test
или tests
или более сложные шаблоны в его имени.
Я также попробовал отрицательный lookbehind через
ack -G '(?<!test)' pattern
но это не работает. Это не исключает каталоги test
.
Ответы
Ответ 1
Использовать недокументированную опцию "-invert-file-match" (версия ack в моей системе: 1.96):
$ ack pattern -G 'test|tests' --invert-file-match
Ну, это задокументировано:
$ ack --help|grep invert
-v, --invert-match Invert match: select non-matching lines
--invert-file-match Print/search handle files that do not match -g/-G.
Он не задокументирован в perldoc.
Ответ 2
С ack2, кажется, вы не можете использовать решение holygeek.
Вот как бы я это сделал, используя -v
и -x
:
ack -v -g 'test' | ack -x pattern
В общем случае 'test'
может быть регулярным выражением для dirs, чтобы исключить
Ответ 3
В интересах людей, использующих версию ack до 1,96 (как и я), вы можете использовать regex look around для этого. Вот пример:
ack --java 'text-pattern' -G '^((?!(test|target)).)*$'
Это будет искать text-pattern
во всех Java
файлах рекурсивно (из.), которые НЕ имеют слов test
или target
в своем пути.
Ответ 4
В последних версиях ack вы можете использовать регулярные выражения с --ignore-dir
.
От этот поток:
Да, в 2.15_01 мы добавили:
- ack теперь поддерживает --ignore-dir = match:.... Спасибо, Айлин Немюй! (Билет GitHub № 42).
Ссылка GitHub: https://github.com/petdance/ack2/issues/42
К сожалению, я думаю, что это поддерживает только имя базового каталога, а не полный путь.
Например, вы не можете сопоставить с ним путь, например ".*/docs/generated/.*"
.
Для этого см. (все еще открыт) GitHub issue 291.