Ответ 1
grep -r db-connect.php . | grep version
Как я могу использовать grep в cygwin для поиска всех файлов, содержащих слова BOTH.
Это то, что я использую для поиска всех файлов в каталоге рекурсивно для одного слова:
grep -r "db-connect.php" .
Как я могу расширить это, чтобы искать файлы, содержащие как "db-connect.php", так и "версию".
Я пробовал это: grep -r "db-connect.php\|version" .
, но это OR, то есть он получает файл, который содержит тот или иной.
Спасибо всем за помощь
grep -r db-connect.php . | grep version
Если вы хотите grep для нескольких строк в файле с разными строками, используйте следующую команду:
grep -rl expr1 | xargs grep -l expr2 | xargs grep -l expr3
Это даст вам список файлов, содержащих expr1, expr2 и expr3.
Обратите внимание, что если любое из имен файлов в каталоге содержит пробелы, эти файлы будут вызывать ошибки. Это можно исправить добавлением -0, я думаю, для grep и xargs.
grep "db-connect.php" * | cut -d: -f1 | xargs grep "version"
Я не пробовал его в рекурсивном режиме, но он должен быть тем же.
В and
вместе с несколькими поисковыми запросами используйте несколько утверждений для просмотра, по одному на предмет, кроме одного:
вместо записи
grep -P A * | grep B
вы пишете
grep -P '(?=.*A)B' *
grep -Pr '(?=.*db-connect\.php)version' .
Не записывайте
grep -P 'A.*B|B.*A' *
поскольку это не выполняется при перекрытиях, тогда как метод (?=…)(?=…)
не работает.
Вы также можете добавить в операторы NOT
. Для поиска строк, которые не соответствуют X
, вы обычно используете -v
в командной строке. Но вы не можете сделать это, если это часть более крупного шаблона. Когда это так, вы добавляете (?=(?!X).)*$)
к шаблону, чтобы исключить что-либо с X
в нем.
Итак, представьте, что вы хотите совместить строки со всеми тремя из A, B, а затем с C или D, но в них нет X или Y. Все, что вам нужно, это:
grep -P '(?=^.*A)(?=^.*B)(?=^(?:(?!X).)*$)(?=^(?:(?!Y).)*$)C|D' *
В некоторых оболочках и в некоторых настройках. вам придется избегать !
, если это ваш символ замены истории.
Там, разве это не круто?
В моем кигвине данные ответы не сработали, но следующее:
grep -l firststring `grep -r -l secondstring . `
Вы имеете в виду "string1" и "string2" в одной строке?
grep 'string1.*string2'
В той же строке, но в неопределенном порядке?
grep '(string1.*string2)|(string2.*string1)'
Или обе строки должны появляться в файле где угодно?
grep -e string1 -e string2
Использует PCRE (регулярные выражения, совместимые с Perl) с многострочным совпадением и возвращает имена файлов, содержащих обе строки (AND
, а не OR
).
grep -Plr '(?m)db-connect\.php(.*\n)*version|version(.*\n)*db-connect\.php' .
Зачем придерживаться только grep:
perl -lne 'print if(/db-connect.php/&/version/)' *