Як використовувати греп для двох різних ліній


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 замість для кращої підтримки perge regex)
  • -z Використовуйте нульовий символ як роздільник (просто роблячи вигляд, що в цьому випадку, але grep візьмемо за це наше слово)
  • -o друкуйте лише відповідну частину

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

так, це корисно лише з -o... відредаговано ...
Zanna

Якщо це буде застосовано на інших дистрибутивах, ви можете зіткнутися з: grep: The -P and -z options cannot be combined- наприклад, grep (GNU grep) 2.5.1 на RHEL
Jason Pyeron

6

Подобається це:

grep "sweet\|lemon"

вибачте, але це відповідатиме точно "солодкому | лимону"
αғsnιη

4
@KasiyA Цей рядок працює чудово. grepза замовчуванням працює в "стандартному режимі", де "спеціальні символи", як |, наприклад +, *інтерпретуються буквально, якщо вони не маскуються з нахилом. Дивіться, наприклад, цю відповідь . Щоб використовувати те, як ви, мабуть, звикли, що "особливі символи" потрібно замаскувати, щоб їх дослівно тлумачити, вам потрібно перейти на "розширений режим" ( grep -E). Може бути, Madneon міг би детальніше розібратися у своїх відповідях, наприклад, до чого б відповідали спроби ОП ?
Геннінг Кокербек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.