LINUX.ORG.RU

разбор текста


0

0

Есть текст примерно такого формата (иного но суть примерно таже):

<some_text>233<some_text>hello1<some_text> <some_text>234<some_text>hello2<some_text> <some_text>235<some_text>hello3<some_text> <some_text>-<some_text>hello4<some_text> <some_text>-<some_text>hello5<some_text> <some_text>236<some_text>hello6<some_text>

Вместо some_text может быть разная ерунда но в принципе формат таков что можно sed'ом вытянуть как число так и текст hello#. А именно они и нужны. Числа идут по порядку. Проблема в том, что вместо числа может быть прочерк '-', что означает что число это такое же как первый "не прочерк" выше этого числа. В общем пример иллюстрирует.

Нужно получить из этого примерно такой текст (опять же не такой но суть примерно такая):

hello1 имеет место 233 hello2 имеет место 234 hello3 имеет место 235 hello4 имеет место 235 hello5 имеет место 235 hello4 имеет место 236

На самом деле нужны не все hello# а только некоторые но тоже не суть.

Проблема в том что количество прочерков в данном тексте неизвестно. Их может как вообще не быть так и быть множество и подряд. Единственное что можно предположить это что в тексте находится хотя бы один не прочерк ниже прочерков или выше.

Так вот если вытянуть hello# с его местом grep'ом и потом sed'ом не представляет никакого труда, то если его место '-' то необходимо поехать по тексту вверх и вниз ища первого непрочерка и если этот непрочерк найден сверху то hello# имеет такое место а если снизу то такое - 1.

Вопрос: как примерно делать это "проехаться вверх и вниз по маскам" в bash? Можно также что-нибудь вроде awk с этим наверное не трудно разобраться. Perl не знаю вообще. :(

Возможно также решение такое - вытянуть из текста все маски вида

<some_text>?<some_text>?<some_text>

по очереди. Как это сделать в bash например? Проблема в том что в реальности маска чуть сложнее и занимает несколько линий причем кончается где-то в середине линии. Поэтому по линиям особо не попарсишь.

Как бы проще всего вытянуть все эти маски в том порядке в каком они находятся в тексте? Или после grep'а поехать от найденной маски по маскам вверх и вниз что в принципе тоже самое?

Скорость некритична - важна простота.

Нужна просто подсказка чем примерно проще всего это сделать.

Заранее спасибо!

anonymous

Шыт ну почему тут едут линии...

Более читаемые примеры (надеюсь теперь не поедут):

=== Cut === Есть текст примерно такого формата (иного но суть примерно таже):

<some_text>233<some_text>hello1<some_text>

<some_text>234<some_text>hello2<some_text>

<some_text>235<some_text>hello3<some_text>

<some_text>-<some_text>hello4<some_text>

<some_text>-<some_text>hello5<some_text>

<some_text>236<some_text>hello6<some_text> === Cut ===

=== Cut === Нужно получить из этого примерно такой текст (опять же не такой но суть примерно такая):

hello1 имеет место 233

hello2 имеет место 234

hello3 имеет место 235

hello4 имеет место 235

hello5 имеет место 235

hello4 имеет место 236 === Cut ===

anonymous
()
Ответ на: комментарий от anonymous

Если говорить кратко, то используй awk. Идёшь по записям и запоминаешь числа в переменную, если вместо числа "-", то берёшь значение из переменной. И т.д.

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от watashiwa_daredeska

Ха, читаю man и вижу что могу это делать при помощи FS. Еще одним достоинством является то что man короткий. :) Спасибо, похоже мои волосы близки к шелковистости.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.