The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Поиск блоков текста"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Поиск блоков текста"  
Сообщение от jd2 (??) on 25-Ноя-08, 05:56 
Приветствую сообщество!

Стоит задача выудить из текста, состоящего из блоков вида

BEGIN some label
some text
...
END

только блоки, содержащие между строками BEGIN/END определённые строки, которые можно определить регулярным выражением. К примеру, начинающиеся с определённого слова. В идеале хотелось бы ещё вырезать строки между началом каждого блока и первой ключевой строкой.

Представляю, как это сделать на perl или, скажем, на C. Но очень хотелось бы иметь это в виде одно-двухстрочного скрипта с использованием grep/sed/awk/etc. В виду недостаточного знания перечисленных инструментов, не могу понять, возможно ли это и если да, то чем проще сделать. А читать всю документацию по всем этим инструментам сейчас нет времени. Так что если кто-нибудь навскидку может сказать, как примерно это сделать (или, например, что сделать это таким путём невозможно), буду премного благодарен.

Для наглядности приведу пример входных и выходных данных. Признаком ключевой строки будем считать 'WORD' в начале такой строки. Итак, имея на входе:

BEGIN something 1
some text 1
...
END

BEGIN something 2
WORD some text 2
...
WORD some text 3
END

BEGIN something 3
some text 4
...
END

BEGIN
some text 5
...
WORD some text 6
...
END

BEGIN
...
END


На выходе нужно получить:
BEGIN something 2
WORD some text 2
...
WORD some text 3
END

BEGIN
WORD some text 6
...
END


Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Поиск блоков текста"  
Сообщение от angra (ok) on 25-Ноя-08, 06:53 
Любопытно почему все-таки не однострочник на perl? ИМХО perl чаще можно встретить чем _нужную_ версию grep/sed/awk. А вообще задача на составление одного регекса, вот только он не тривиален, а я привык к перловым регексам и нет желания писать его для POSIX или еще чего-нибудь, особенно с учетом того, что вы так и не уточнили какая именно из существующих реализаций регексов вам нужна. На pcre это будет что-то вроде
/^BEGIN(?:.(?!^END))*^WORD(?:.(?!^END))*.^END$/smg
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Поиск блоков текста"  
Сообщение от Fylhtq (ok) on 26-Ноя-08, 17:53 
>Приветствую сообщество!
>
>Стоит задача выудить из текста, состоящего из блоков вида

Однострочника не получится, 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

Как-то так. Не проверял, ибо рабочий день ёк и домой пора :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру