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

10

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

Например

Линия 1: Это сладкое.

Линия 2: лимон.

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

grep "sweet.*lemon" file_type
    
задан Vijay Chakraborty 10.12.2016 в 07:49
источник

2 ответа

16

Чтобы использовать 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 , файл имеет значение null, разделенное на -z :

$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.

Примечания:

  • -E Использовать расширенные регулярные выражения (использовать символ | для чередования без необходимости его удаления)
  • -An Печать дополнительных строк после шаблона, где n - количество строк для печати
  • -P Использовать регулярные выражения в стиле perl ("экспериментальный" в grep - установить pcregrep вместо лучшей поддержки regex perl)
  • -z Использовать нулевой символ как разделитель (просто притворяясь в этом случае, но grep возьмет наше слово за него)
  • -o распечатать только согласованную часть
ответ дан Zanna 10.12.2016 в 07:58
5

Вот так:

grep "sweet\|lemon"
    
ответ дан madneon 10.12.2016 в 07:57