LINUX.ORG.RU

sed выборочная печать строк


0

1

Добрый день.

есть файл вида:
........
........
........

TITLE1

some string 1
some string 2
........
somestring n

TITLE2

another string 1
another string 1
........
another string n

Нужно напечатать то, что между TITLE1 и TITLE2
сейчас пользуюсь конструкцией:
sed -n /TITLE1/,/TITLE2/p file
Довольно часто TITLE2 меняется. Приходится скрипт переписывать.
Каким образом можно вывести на печать все что находится между TITLE1 и второй пустой строкой?

Спасибо.

★★

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

Да - именно так. Пробелы перед и после всегда присутствуют.

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

А, понял. Не внимательно прочитал задание, сори.

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

Спасибо. Работает, но тут та же проблема, что и с

sed -n /TITLE1/,/TITLE2/p file

если поменялся TITLE2 приходится переделывать скрипт. Шило на мыло так сказать...

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

Да сильно. Тут бы что придумать именно с печатью абзаца до второй пустой строки.

Неужто sed не может? Я уже мозги поломал.

swarnk ★★
() автор топика
Ответ на: комментарий от drull
drull@ubuntu:~/img$ cat file.txt 
........
........
........

TITLE1

some string 1
some string 2
........
somestring n

TITLE2

another string 1
another string 1
........
another string n
drull@ubuntu:~/img$ grep -A 1000000 TITLE1 file.txt | sed "1,2d" | grep -B 100000 -e "^$" | grep -v -e "^$" | sed '$d'
some string 1
some string 2
........
somestring n
drull@ubuntu:~/img$
drull ★☆☆☆
()
Ответ на: комментарий от drull

> Да сильно. Тут бы что придумать именно с печатью абзаца до второй пустой строки.

Неужто sed не может? Я уже мозги поломал

sed -nr '/TITLE1/ {:l N; s/^TITLE1\n+(.*)\n$/\1/p; T l; q }'

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

а вот эта магия мне нравится еще больше.

На первый взгляд совершенно непонятно. Буду разбираться.

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

Если принять, что сразу после TITLE1 идёт пустая строка, то есть нужно печатать до первой пустой строки после первой пропущенной после TITLE1 строки, то можно так:

sed -n '/TITLE1/{n;:l;n;/^$/q;p;bl}'

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

Спасибо и Вам огромное за помощь.

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

А нет ли такой API-заготовки, чтобы для файла конфига, который нужно распарсить, накидать описание его семантики и скормить сам файл и его описание некому API на питоне, чтобы легко были доступны программно все структуры, имеющиеся в конфиге?

Чтобы не городить угребищные скрипты-калеки из sed-ов.

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

Зачем городить костыли, если есть непосредственно потоковый редактор. Тем более, универсальное API для семантики будет того же уровня сложности.

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

Не знаю, наверное на питоне много чего есть. Хотя, ИМХО, обычно берут какой-то парсер конфигов и пишут конфиг под его возможности.

А ТС просил sed, причём не уточнял, что он парсит конфиг или лог.

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