Несколько шаблонов с ack-grep?

Можно ли (и как) связать шаблоны с ack (ack-grep в некоторых дистрибутивах Linux), как я привык с grep?

e.g.

grep "foo" somefile.c | grep -v "bar"

... чтобы сопоставить все строки с "foo", но без "bar".


person scrrr    schedule 31.05.2011    source источник


Ответы (1)


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

^(?!.*bar).*foo.*$

будет соответствовать строке, которая содержит foo, но не содержит bar.

Я не знаком с использованием ack, но что-то вроде этого должно работать:

ack '^(?!.*bar).*foo.*$' myfile
person Tim Pietzcker    schedule 31.05.2011
comment
Проблема в том, что если в файле нет bar, поиск foo даже не производится. - person Anthony Hatzopoulos; 24.11.2015
comment
@AnthonyHatzopoulos: Почему это может быть проблемой? - person Tim Pietzcker; 24.11.2015
comment
ОП ищет строки с foo. И тогда они не хотят возвращать эти строки с полосой на них. Я думаю, так уж получилось, что в файле была полоса, и они получили то, что хотели. Хотя он не будет возвращать файлы только с foo. Скажем, я ищу всех foo(), но не foo(bar), мне все равно нужны все остальные foos. В моем случае somefile.c — это целый проект. Хотя стоило упомянуть. - person Anthony Hatzopoulos; 24.11.2015
comment
Нет. Во-первых, . не соответствует новой строке, поэтому просмотр вперед всегда будет смотреть вперед только на одну строку. Но это не имеет значения для ack, так как он все равно работает построчно. Он никогда не просматривает весь файл. - person Tim Pietzcker; 24.11.2015
comment
Прошу прощения, ты прав, Тим. Этот метод у вас действительно работает. В более простом тесте это сработало для меня. Я сделал ошибку с моими собственными дополнениями к моему варианту использования. +1 - person Anthony Hatzopoulos; 24.11.2015
comment
В моем случае я использовал параметр -l для печати только имен файлов, содержащих совпадения, и это не сработало. - person Anthony Hatzopoulos; 24.11.2015