В ack, я могу определить тип, который ограничен как расширением, так и первой строкой (два типа фильтра)? - PullRequest
0 голосов
/ 17 мая 2019

Если я правильно понимаю (из Определение ваших собственных типов в ack --man), когда я использую --type-set в .ackrc (или в командной строке), я могу использовать только один «тип фильтра» , В моем случае я хотел бы сопоставить файлы с определенным расширением, которые также имеют шаблон, присутствующий в первой строке. Я думал, что это будет выглядеть так (возможно, без --type-set в середине:

--type-set
mytype:firstlinematch:my.regex.pattern...
--type-set
mytype:ext:myextension

Однако, если я это сделаю, соответствие строки игнорируется, потому что тип заменяется 2-й записью. *

Я знаю, что для --type-add допускается несколько записей, но это означает, что в этом ИЛИ условие должно быть истинным, а не ограничиваться тем, когда оба являются истинными.

Есть ли способ сузить использование двух типов фильтров для случая, подобного этому?

  • (Если я прав по этому поводу, тогда предупреждение поможет, если определение позднее будет перенесено в .ackrc.)

1 Ответ

0 голосов
/ 06 июня 2019

Использование --type-add в качестве второго определения не является ограничительным.Если один определяет foo типы файлов следующим образом:

ack --type-set foo:.txt --foo bar

Это находит все txt файлы с bar где-то в файле.Если кто-то добавляет к этому типу файла, установите соответствие первой строки:

ack --type-set foo:.txt --type-add foo:firstlinematch:/pr.*t/ --foo bar

Это переопределяет тип файла как все текстовые файлы И любой файл, содержащий регулярное выражение /pr.*t/ в его первой строке.Соответственно, он находит все bar s в этом наборе файлов.Другими словами, type-add - это добавление s к определению файлов.В файле man явно сказано:

«Спецификации типов могут повторяться и объединяться в OR».

...