Приветствую сообщество!Стоит задача выудить из текста, состоящего из блоков вида
BEGIN some label
some text
...
END
только блоки, содержащие между строками BEGIN/END определённые строки, которые можно определить регулярным выражением. К примеру, начинающиеся с определённого слова. В идеале хотелось бы ещё вырезать строки между началом каждого блока и первой ключевой строкой.Представляю, как это сделать на perl или, скажем, на C. Но очень хотелось бы иметь это в виде одно-двухстрочного скрипта с использованием grep/sed/awk/etc. В виду недостаточного знания перечисленных инструментов, не могу понять, возможно ли это и если да, то чем проще сделать. А читать всю документацию по всем этим инструментам сейчас нет времени. Так что если кто-нибудь навскидку может сказать, как примерно это сделать (или, например, что сделать это таким путём невозможно), буду премного благодарен.
Для наглядности приведу пример входных и выходных данных. Признаком ключевой строки будем считать 'WORD' в начале такой строки. Итак, имея на входе:
BEGIN something 1
some text 1
...
ENDBEGIN something 2
WORD some text 2
...
WORD some text 3
ENDBEGIN something 3
some text 4
...
ENDBEGIN
some text 5
...
WORD some text 6
...
ENDBEGIN
...
END
На выходе нужно получить:BEGIN something 2
WORD some text 2
...
WORD some text 3
ENDBEGIN
WORD some text 6
...
END
Любопытно почему все-таки не однострочник на perl? ИМХО perl чаще можно встретить чем _нужную_ версию grep/sed/awk. А вообще задача на составление одного регекса, вот только он не тривиален, а я привык к перловым регексам и нет желания писать его для POSIX или еще чего-нибудь, особенно с учетом того, что вы так и не уточнили какая именно из существующих реализаций регексов вам нужна. На pcre это будет что-то вроде
/^BEGIN(?:.(?!^END))*^WORD(?:.(?!^END))*.^END$/smg
>Приветствую сообщество!
>
>Стоит задача выудить из текста, состоящего из блоков видаОднострочника не получится, sed не обрабатывает перевод строки, к сожалению.
#!/sbin/sh
A=""
for I in 'grep -e "BEGIN" -e "END" -e "WORD" file.txt'
do
[ `echo $I|cut -f1` = "WORD" ]&&echo $A
[ `echo $I|cut -f1` = "END" -a `echo $A|cut -f1` = "WORD" ]&&echo $I
A=$I
doneКак-то так. Не проверял, ибо рабочий день ёк и домой пора :)