Как я могу найти две разные фразы, когда они находятся в двух разных строках, с помощью одной 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
для.