Як я можу шукати дві різні фрази, коли вони знаходяться в двох різних рядках, використовуючи одну 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
замість для кращої підтримки perge regex)-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
). Може бути, Madneon міг би детальніше розібратися у своїх відповідях, наприклад, до чого б відповідали спроби ОП ?
grep -zP
команда працювала б у цьому конкретному випадку (файл, що складається з рівно двох рядків), як правило, будь-який звичайний файл, розділений за допомогою нового рядка, вважається єдиним рядком, тому або скидайте весь вміст файлу (якщо десь відповідає) або нічого; зазвичай це не те,grep
для чого люди використовують .