Как я могу найти две разные фразы, когда они находятся в двух разных строках, с помощью одной grepкоманды?
Например
Строка 1: Это сладко.
Строка 2: лимон.
Я использовал это, но без результата
grep "sweet.*lemon" file_type
Как я могу найти две разные фразы, когда они находятся в двух разных строках, с помощью одной grepкоманды?
Например
Строка 1: Это сладко.
Строка 2: лимон.
Я использовал это, но без результата
grep "sweet.*lemon" file_type
Ответы:
Чтобы использовать grepдве разные строки, найдите оба шаблона.
$ grep -e sweet -e lemon file_type
This is a sweet
lemon.
Или используйте чередование
$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.
Чтобы получить следующую строку после шаблона, вы можете использовать контекстную опцию
$ grep -A1 sweet file_type
This is a sweet
lemon.
Но если вы ищете явно для многострочного шаблона, что это сложно , потому что grepдумает , что в строках ... . Вы .*поймаете все между "сладким" и "лимонным" на линии . Мы можем получить «лимон» на следующей строке, -Pиспользуя, \nчтобы соответствовать новой строке и сообщая, grepчто файл отделен от нуля -z:
$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.
-EИспользуйте расширенные регулярные выражения (чтобы использовать |символ для чередования без необходимости экранировать его)-An Выведите дополнительные строки после шаблона, где n - количество задних строк для печати-PИспользуйте регулярные выражения в стиле Perl ( вместо этого «в эксперименте» grep- установите pcregrepдля лучшей поддержки регулярных выражений Perl)-zИспользуйте нулевой символ как разделитель (просто притворяясь в этом случае, но grepвозьмем наше слово для этого)-o печатать только соответствующую часть-o... отредактировано ...
grep: The -P and -z options cannot be combined- например, grep (GNU grep) 2.5.1 на RHEL
Как это:
grep "sweet\|lemon"
grepпо умолчанию работает в «стандартном режиме», где «специальные символы» , как |, +, *интерпретируются буквально , если они не замаскированы с помощью обратной косой черты. Смотрите, например, этот ответ . Чтобы использовать то, к чему вы, вероятно, привыкли, что «специальные символы» должны быть замаскированы, чтобы интерпретироваться буквально, вам нужно переключиться в «расширенный режим» ( grep -E). Может быть, Маднеон мог бы более подробно рассказать о своих ответах, например, то, что попытка ОП сочла бы ?
grep -zPкоманда будет работать в этом конкретном случае (файл, состоящий ровно из двух строк), в общем случае любой обычный файл, разделенный символом новой строки, будет рассматриваться как одна строка, поэтому либо выгрузите содержимое всего файла (если есть совпадение где-либо) или ничего; обычно это не то, что люди используютgrepдля.