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

#regex #grep #ack

#регулярное выражение #grep #подтверждение

Вопрос:

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

например

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

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

Ответ №1:

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

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

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

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

 ack '^(?!.*bar).*foo.*$' myfile
  

Комментарии:

1. Проблема в том, что если в файле нет bar этого, поиск foo даже не выполняется.

2. @AnthonyHatzopoulos: Почему это может быть проблемой?

3. OP ищет строки с foo . И тогда они не хотят возвращать эти строки с bar на них. Я думаю, так получилось, что в файле был bar, и они получили то, что хотели. Хотя это не вернет файлы только с foo . Допустим, я ищу все, foo() но не foo(bar) , мне все равно нужны все мои другие foo . В моем случае somefile.c это целый проект. Просто, хотя это стоило упомянуть.

4. Нет. Во-первых, . не соответствует новым строкам, поэтому при просмотре всегда будет просматриваться только одна строка. Но это не имеет значения с ack , поскольку он все равно работает построчно. Он никогда не просматривает весь файл целиком.

5. Я прошу прощения, ты прав, Тим. Этот ваш метод действительно работает. В более простом тесте у меня это сработало. Я допустил ошибку с моими собственными дополнениями к моему варианту использования. 1