Як я можу шукати дві різні фрази, коли вони знаходяться в двох різних рядках, використовуючи одну 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для чого люди використовують .