Я пытаюсь использовать grep
для сопоставления строк, которые содержат две разные строки. Я пробовал следующее, но это соответствует строки, которые содержат либо string1 или string2, что не то, что я хочу.
grep 'string1\|string2' filename
Так как же сопоставить grep
только строки, содержащие обе строки ?
Ответы:
Ты можешь использовать
grep 'string1' filename | grep 'string2'
Или,
grep 'string1.*string2\|string2.*string1' filename
источник
grep -e "string1" -e "string2"
Я думаю, это то, что вы искали:
Я думаю, что ответы таковы:
соответствует только случаю, когда присутствуют оба, а не один или другой или оба.
источник
grep -e "string1" -e "string2" filename
сделал бы то же самое?How do I match lines that contains *both* strings?
Для поиска файлов, содержащих все слова в любом порядке в любом месте:
Первый grep запускает рекурсивный поиск (
r
), игнорируя case (i
) и перечисляя (распечатывая) имена файлов, которые соответствуют (l
) для одного термина ('action'
с одинарными кавычками), встречающегося в любом месте файла.Последующие greps ищут другие термины, сохраняя нечувствительность к регистру и выводя соответствующие файлы.
Окончательный список файлов, которые вы получите, будет содержать эти термины в любом порядке в любом месте файла.
источник
grep -ril 'foo' | xargs -d '\n' grep -il 'bar'
Если у вас есть
grep
с-P
возможностью для ограниченногоperl
регулярного выражения, вы можете использоватькоторый имеет преимущество работы с перекрывающимися строками. Использование
perl
as несколько прощеgrep
, потому что вы можете указать логику и непосредственно:источник
Ваш метод был почти хорош, пропустил только -w
источник
grep -V
.grep -w 'regexp1\|regexp2' filename
|
Оператор в регулярном выражении означает или. То есть будут совпадать либо string1, либо string2. Вы могли бы сделать:который передаст результаты первой команды во второй grep. Это должно дать вам только те строки, которые соответствуют обоим.
источник
Вы можете попробовать что-то вроде этого:
источник
И как люди предложили Perl и Python, а также сложные сценарии оболочки, вот простой подход awk :
Посмотрев на комментарии к принятому ответу: нет, это не делает многострочным; но это также не то, о чем просил автор вопроса.
источник
Не пытайтесь использовать grep для этого, используйте вместо этого awk. Чтобы сопоставить 2 регулярных выражения R1 и R2 в grep, можно подумать, что это будет:
в то время как в awk это будет:
но что, если
R2
перекрывается или является подмножествомR1
? Эта команда grep просто не будет работать, в то время как команда awk будет работать. Допустим, вы хотите найти строки, которые содержатthe
иheat
:Для этого вам нужно использовать 2 greps и трубу:
и, конечно, если вы действительно требовали, чтобы они были отдельными, вы всегда можете написать в awk то же регулярное выражение, которое вы использовали в grep, и есть альтернативные решения awk, которые не предполагают повторение регулярных выражений в каждой возможной последовательности.
Если оставить в стороне, что делать, если вы хотите расширить свое решение для соответствия 3 регулярным выражениям R1, R2 и R3. В grep это был бы один из этих неудачных вариантов:
в то время как в awk это будет кратким, очевидным, простым, эффективным:
Теперь, что если вы действительно хотите сопоставить литеральные строки S1 и S2 вместо регулярных выражений R1 и R2? Вы просто не можете сделать это за один вызов grep, вы должны либо написать код, чтобы экранировать все метасхемы RE, прежде чем вызывать grep:
или снова используйте 2 greps и трубу:
что опять-таки плохой выбор, тогда как с помощью awk вы просто используете строковый оператор вместо оператора регулярного выражения:
А что если вы хотите сопоставить 2 регулярных выражения в абзаце, а не в строке? Не может быть сделано в grep, тривиально в awk:
Как насчет всего файла? Снова не может быть сделано в grep и тривиально в awk (на этот раз я использую GNU awk для multi-char RS для краткости, но это не намного больше кода в любом awk, или вы можете выбрать контрольный char, который вы не знаете быть на входе для RS, чтобы сделать то же самое):
Итак, если вы хотите найти несколько регулярных выражений или строк в строке, абзаце или файле, не используйте grep, используйте awk.
источник
awk '/R1/ && /R2/'
регистронезависимым?awk -v IGNORECASE=1 '/R1/ && /R2/'
и с любым awkawk '{x=toupper($0)} x~/R1/ && x~/R2/'
GNU grep версия 3.1
источник
Найдены строки, которые начинаются только с 6 пробелов и заканчиваются:
источник
Допустим, нам нужно найти количество слов в тестовом файле. Есть два способа сделать это
1) Используйте команду grep с шаблоном сопоставления регулярных выражений
2) Используйте команду egrep
С egrep вам не нужно беспокоиться о выражении, а просто разделяйте слова разделителем каналов.
источник
git grep
Вот синтаксис, использующий
git grep
несколько шаблонов:Вы также можете комбинировать шаблоны с логическими выражениями, такими как
--and
,--or
и--not
.Проверьте
man git-grep
на помощь.Другие параметры для рассмотрения:
Чтобы изменить тип шаблона, вы также можете использовать
-G
/--basic-regexp
(по умолчанию),-F
/--fixed-strings
,-E
/--extended-regexp
,-P
/--perl-regexp
,-f file
и другие.Связанный:
Для операции ИЛИ см .:
источник
Поместите строки, которые вы хотите grep для в файл
Затем поиск с использованием -f
источник
получит строку с string1 и string2 в любом порядке
источник
Это работает для точного совпадения слов и совпадения слов без учета регистра, для этого используется -i
источник
для многострочного соответствия:
или
нам просто нужно удалить символ новой строки, и это работает!
источник
Вы должны иметь
grep
вот так:источник
Я часто сталкиваюсь с той же проблемой, что и ваша, и я просто написал фрагмент сценария:
Использование:
Вы можете положить его в .bashrc, если хотите.
источник
Когда обе строки в последовательности, поместите шаблон между ними в
grep
команде:Пример, если следующие строки содержатся в файле с именем
Dockerfile
:Чтобы получить строку, содержащую строки:
FROM python
иas build-python
затем используйте:Тогда в выводе будет показана только строка, содержащая обе строки :
источник
ripgrep
Вот пример использования
rg
:Это один из самых быстрых инструментов поиска, так как он построен на основе движка регулярных выражений Rust который использует конечные автоматы, SIMD и агрессивные буквальные оптимизации, чтобы сделать поиск очень быстрым.
Используйте его, особенно когда вы работаете с большими данными.
См. Также запрос связанных функций на GH-875 .
источник
string2
появляется раньшеstring1
. Самое простое решение этой проблемыrg string1 file.txt | rg string2
.