Intereting Posts
Как я могу расширить его? Как настроить порог, когда мой вентилятор входит в (ноутбук) Используйте minisat, чтобы найти все решения для SAT в KDE 5, как заставить приложение GUI показывать / скрывать с помощью ярлыка, похожего на Tilda / guake / yakuake Невозможно использовать WEBEX в CentOS 6.5, Fedora 18 и 20 Изменение разрешений в каталогах монтирования монтирования NFS + с гостевой виртуальной машиной В vim, как вы выполняете команду молча в фоновом режиме? Использование именованных каналов для отправки нажатия клавиш в интерактивную программу Изменить каталог для файлов подсветки синтаксиса Kate Как найти и заменить содержимое файлов, которые соответствуют шаблону? Как заменить последнее появление персонажа? Почему бы нам не включить драйверы файловой системы в ядро, а не использовать Initrd / Initramfs Не удалось разрешить имя хоста Удаление символов из строки Ошибка php-fpm неспособна связать прослушивающий сокет для адреса 127.0.0.1:9003: Разрешение отклонено (13)

Как связывать линии между шаблоном начала и конца?

У меня есть файл, который имеет следующий контент:

zdk aaa b12 cdn dke kdn 

Input1: aaa и cdn

Выход 1:

 aaa b12 cdn 

Вход 2: zdk и dke

Выход 2:

 zdk aaa b12 cdn dke 

Я мог бы использовать команды ниже для достижения:

 grep -a aaa -A2 file # Output 1 grep -a aaa -A4 file # Output 2 

Но в файле я не знаю, каково точное вхождение (позиция) шаблона конечной строки (файл имеет 20000 строк)

Как я могу это достичь?

grep не поможет. Это работа, которую лучше выполнить с помощью sed используя выражения диапазона:

 $ sed -n '/aaa/,/cdn/p' file aaa b12 cdn $ sed -n '/zdk/,/dke/p' file zdk aaa b12 cdn dke 

sed -n подавляет автоматическую печать, так что строки печатаются, только если их явно просят. И это происходит, когда происходит диапазон /aaa/,/cdn/ .

Эти выражения диапазона также доступны в awk , где вы можете сказать:

 awk '/zdk/,/dke/' file 

Конечно, все эти условия могут быть расширены до более строгого регулярного выражения, такого как sed -n '/^aaa$/,/^cdn$/p' file чтобы проверить, что строки состоят именно из aaa и cdn , ничего больше.

Это можно сделать sed

 sed -n ' /^aaa$/,/^cdn$/w output1 /^zdk$/,/^dke$/w output2 ' file 

Вот команда grep :

 grep -o "aaa.*cdn" <(paste -sd_ file) | tr '_' '\n' 

Вы можете достичь многострочного совпадения в grep , но вам нужно использовать perl-regexp для grep ( -P – который не поддерживается на каждой платформе, например OS X), так как обходной путь мы заменяем новые строки символом _ и после grep , мы меняем их.

В качестве альтернативы вы можете использовать pcregrep который поддерживает многострочные шаблоны ( -M ).

Или используйте ex :

 ex +"/aaa/,/cdn/p" -scq! file