Как использовать grep для 2 разных строк


15

Как я могу найти две разные фразы, когда они находятся в двух разных строках, с помощью одной grepкоманды?

Например

Строка 1: Это сладко.

Строка 2: лимон.

Я использовал это, но без результата

grep "sweet.*lemon" file_type

Ответы:


20

Чтобы использовать 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 печатать только соответствующую часть

Хотя grep -zPкоманда будет работать в этом конкретном случае (файл, состоящий ровно из двух строк), в общем случае любой обычный файл, разделенный символом новой строки, будет рассматриваться как одна строка, поэтому либо выгрузите содержимое всего файла (если есть совпадение где-либо) или ничего; обычно это не то, что люди используют grepдля.
Марк ван Леувен

да, это полезно только с -o... отредактировано ...
Zanna

В случае, если это испробовано на других дистрибутивах, вы можете встретить: grep: The -P and -z options cannot be combined- например, grep (GNU grep) 2.5.1 на RHEL
Джейсон Пиерон,

6

Как это:

grep "sweet\|lemon"

извините, но это будет точно соответствовать "sweet | lemon"
αғsнιη

4
@KasiyA Эта строка работает нормально. grepпо умолчанию работает в «стандартном режиме», где «специальные символы» , как |, +, *интерпретируются буквально , если они не замаскированы с помощью обратной косой черты. Смотрите, например, этот ответ . Чтобы использовать то, к чему вы, вероятно, привыкли, что «специальные символы» должны быть замаскированы, чтобы интерпретироваться буквально, вам нужно переключиться в «расширенный режим» ( grep -E). Может быть, Маднеон мог бы более подробно рассказать о своих ответах, например, то, что попытка ОП сочла бы ?
Хеннинг Кокербек
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.