#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