Я хотел бы получить совпадение нескольких шаблонов с неявным AND между шаблонами, т.е. эквивалентно запуску нескольких greps в последовательности:
grep pattern1 | grep pattern2 | ...
Так как же преобразовать его в нечто подобное?
grep pattern1 & pattern2 & pattern3
Я хотел бы использовать один grep, потому что я строю аргументы динамически, поэтому все должно помещаться в одну строку. Использование фильтра - это системная функция, а не grep, поэтому это не аргумент.
Не путайте этот вопрос с:
grep "pattern1\|pattern2\|..."
Это ИЛИ совпадение с несколькими образцами.
grep
regular-expression
greenoldman
источник
источник
Ответы:
agrep
может сделать это с помощью следующего синтаксиса:Используя GNU
grep
, при поддержке PCRE вы можете:С аст
grep
:(добавление
.*
s as<x>&<y>
соответствует строкам, которые совпадают<x>
и<y>
точно ,a&b
и никогда не совпадет , так как нет такой строки, которая может быть одновременноa
иb
одновременно).Если шаблоны не перекрываются, вы также можете сделать:
Лучший портативный способ, вероятно, с,
awk
как уже упоминалось:С
sed
:Пожалуйста, имейте в виду, что все они будут иметь разный синтаксис регулярных выражений.
источник
agrep
Синтаксис не работает для меня ... какая версия была она введена в?agrep
могут быть включены в glimpse / webglimpse . Возможно, у вас есть другая реализация. У меня была ошибка для версии ast-grep, хотя, опция для расширенных регулярных выражений есть-X
, нет-A
.agrep
0,8.0 на Fedora 23. Похоже, это отличаетсяagrep
от того, на который вы ссылаетесь.agrep
.awk '/p1/ && /p2/ {n++}; END {print 0+n}'
Вы не указали версию grep, это важно. Некоторые механизмы регулярных выражений допускают множественное сопоставление, объединенное оператором AND с использованием '&', но это нестандартная и непереносимая функция. Но, по крайней мере, GNU grep не поддерживает это.
OTOH вы можете просто заменить grep на sed, awk, perl и т. Д. (Перечислены в порядке увеличения веса). С awk команда будет выглядеть так:
и он может быть сконструирован так, чтобы его можно было легко указать в командной строке.
источник
awk
использует ERE, например, эквивалентgrep -E
, в отличие от BRE, которыйgrep
использует обычный .awk
Регулярные выражения называются ERE, но на самом деле они немного своеобразные. Вот, вероятно, более подробная информация, чем кому-либо небезразлична: wiki.alpinelinux.org/wiki/Regexawk
- просто знать больше лучше).{ print; }
деталь здесь не нужна или не нужна.Если в
patterns
каждой строке содержится один шаблон, вы можете сделать что-то вроде этого:Или это соответствует подстроки вместо регулярных выражений:
Чтобы напечатать все вместо строк ввода в
patterns
пустом случае, замените ихNR==FNR
наFILENAME==ARGV[1]
илиARGIND==1
наgawk
.Эти функции печатают строки STDIN, которые содержат каждую строку, указанную в качестве аргумента в качестве подстроки.
ga
выступает за grep all иgai
игнорирует регистр.источник
Это не очень хорошее решение, но иллюстрирует несколько крутой трюк
источник
chained-grep()
или нет,function chained-grep
ноfunction chained-grep()
: unix.stackexchange.com/questions/73750/…git grep
Вот синтаксис, использующий
git grep
объединение нескольких шаблонов с использованием логических выражений:Приведенная выше команда напечатает строки, соответствующие всем шаблонам одновременно.
Проверьте
man git-grep
на помощь.Смотрите также:
Для операции ИЛИ см .:
источник
ripgrep
Вот пример использования
rg
:Это один из самых быстрых инструментов поиска, поскольку он построен на основе движка регулярных выражений Rust, который использует конечные автоматы, SIMD и агрессивные буквальные оптимизации, чтобы сделать поиск очень быстрым.
См. Также запрос связанных функций на GH-875 .
источник
Вот мое мнение, и это работает для слов в несколько строк:
Используйте с
find . -type f
последующим количеством-exec grep -q 'first_word' {} \;
и последним ключевым словом с
-exec grep -l 'nth_word' {} \;
-q
тихие / тихие-l
файлы шоу со спичкамиДалее возвращается список имен файлов со словами «кролик» и «дыра» в них:
find . -type f -exec grep -q 'rabbit' {} \; -exec grep -l 'hole' {} \;
источник
Чтобы найти ВСЕ слова (или шаблоны), вы можете запустить grep в цикле FOR . Основным преимуществом здесь является поиск по списку регулярных выражений .
РЕДАКТИРОВАТЬ мой ответ с реальным примером:
Теперь давайте запустим этот файл:
источник
ALL
оператора, ваш код работает какOR
оператор, а неAND
. И кстати. для этого (OR
) гораздо более простое решение, заданное прямо в вопросе.AND
операторе, то есть файл является только положительным попаданием, если он соответствует шаблону A и шаблону B и шаблону C и ...AND
В вашем случае файл имеет положительный результат, если он соответствует образец A или образец B или ... Вы видите разницу сейчас?AND
их. Затем вам следует переписать сценарий для работы с несколькими файлами - тогда, возможно, вы поймете, что на вопрос уже дан ответ, и ваша попытка ничего не приносит на стол, извините.