LINUX.ORG.RU

sed, который «я так вижу»

 ,


5

2

Решился я, наконец, выложить свой вариант sed-а, который меня устраивает. В отличии от оригинального, он работает с буфером целиком, а не построчно. Имеет дополнительный и целый стек буферов, а также счётчик, что позволяет несложно обрабатывать вложенный развесистый синтаксис, всевозможные вложенные блоки. Умеет символ '\0', правда для этого требует отсутствия любого другого символа в тексте/паттернах/заменах. Умеет перекодировать через iconv. regex-ы, подгружаемые и имена выгружаемых файлов могут быть динамически сформированы в процессе исполнения. Пока не умеет матчить номера строк, но, думаю это и не надо. Зато буковок под команды — 46.

Полное описание

В качестве примеров приложены скрипты для очистки html-ей после офисов (open/ms) и из lib.ru/samlib.ru для приемлемого результата для ручной правки или просмотра читалками.

★★★★★

Последнее исправление: vodz (всего исправлений: 1)

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

после OOo/LO он тоже чистит, но чистка html именно после mso у меня вызывает вполне ностальгические воспоминания о благословенных 90-х

В которые я, кстати, для этой и подобных целей awk пользовал.

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

В которые я, кстати, для этой и подобных целей awk пользовал.

Построчно? Когда на одной строке заканчивается один тег и начинается другой? Или выключали RS? Оно, конечно, даже удобно, когда разделятся на разные поля разные аттрибуты, но всё равно трах, сделаешь '>' как разделитель, получишь лишние поля. Я же тоже всё это пробовал, неудобно это.

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

выключали RS? … но всё равно трах, сделаешь ‘>’ как разделитель, получишь лишние поля

Ну да, именно так. Неудобный недопарсер html-кода. И да, уже по одному этому примеру оценил мощь bsed-а.

be_nt_all ★★
()
Последнее исправление: be_nt_all (всего исправлений: 1)
Ответ на: комментарий от be_nt_all

Спасибо. Пошёл читать/просвещаться.

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

Вопрос был не про GNU vs PCRE. Вопрос состоит в том, можно ли выполнять команды на выбранных регуляркой подмножествах. В PDF по ссылке есть примеры:

A more dramatic example is to capitalize all occurrences of words ‘i’: x/[A-Za-z]+/ g/i/ v/../ c/I/ — extract all the words, find those that contain ‘i’, reject those with two or more characters, and change the string to ‘I’ (borrowing a little syntax from the substitute command). Some people have overcome the dif- ficulty of selecting words or identifiers using regular expressions by adding notation to the expressions, which has the disadvantage that the precise definition of ‘identifier’ is immutable in the implementation. With sam, the definition is part of the program and easy to change, although more long-winded.

quantum-troll ★★★★★
()

свой вариант sed-а

А свой вариант csplit могёшь? Чтоб он не только сплитил, но и куски обзывал на основании содержимого первой строки. Например:

pdftk my_doc.pdf cat 1-end output temp.pdf
mkdir po; ncsplit -n 4 -f po/obj. temp.pdf /obj/ /endobj/1 '{*}'

–>obj.0.1096

1096 0 obj 
<<
/Width 799
/BitsPerComponent 8
/Name /X
/Height 921
/Decode [0.0 255.0]
/Intent /RelativeColorimetric
/Filter /FlateDecode
/Subtype /Image
/Length 690036
/Type /XObject
/ColorSpace 1094 0 R
>>
stream
... IDATA ...
endstream
endobj
anonymous
()
Ответ на: комментарий от quantum-troll

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

subregex-ы можно у меня выносить в отельный буфер, там делать что надо, потом собирать в исходный, по циклу или по константному количеству или вообще по вычисленному счётчику. Тем и хорошо программирование, что можно удобно, наглядно, с любой степени вычурности обрабатывать самостоятельно, а не втыкать как изращаться с хитропопыми регексами, выдуманными только ради чсв.

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

https://www.cs.helsinki.fi/u/jjaakkol/sgrepman.html

Ну да, тоже авторское видение. Вот только если смысл изучать совершенно ни на что не похожий синтаксис? Я постарался сделать его похожим на (s)ed, и таки получилось.

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

На всякий случай: structured grep доунлоабелен с http://gnuwin32.sourceforge.net/packages/sgrep.htm (вроде исходники оригинальные). Это о пользе публичных репозиториев – sf.net несколько раз менял хозяев, подвергася (за дело) проклятиям эпического уровня, но исходный код опубликованный там по прежнему доступен (если автор не убирал его сознательно). А личный ftp, ну чтобы он перестал работать хозяину даже не обязательно менять место работы.

be_nt_all ★★
()
Последнее исправление: be_nt_all (всего исправлений: 2)
Ответ на: комментарий от anonymous

но и куски обзывал на основании содержимого первой строки

В отличии от sed, у меня выходные файлы для записи можно делать динамические, если я правильно понял задачу, то как раз по имени первого поля как раз — запросто.

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

А личный ftp, ну чтобы он перестал работать хозяину даже не обязательно менять место работы.

Сами с собой разговариваете? Как я уже говорил — авторам это почти до лампочки, только один кейс тут может для них помочь, когда они сами свой исходник потеряют.

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

Пример разбиения pdf-ки на объекты с помощью bsed. Могёт?

Тут вдруг окажется, что и не каждый pdf-просмоторщик корректно то могёт распарсить. Ирония совсем неуместна. А вот почистить текст после извлечения извлекалкой может и поможет.

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

авторам это почти до лампочки

да не вопрос, опубликовали полезную утилиту в исходниках, строчка про gpl в верхнем комменте есть. Спасибо. .

когда они сами свой исходник потеряют.

тоже вполне реальный вариант, вообще-то

be_nt_all ★★
()
Последнее исправление: be_nt_all (всего исправлений: 2)
Ответ на: комментарий от vodz

не каждый pdf-просмоторщик корректно то могёт распарсить.

Стопэ! Мы не говорим про любой PDF. Мы говорим про PDF, прошедший через pdftk (см. выше).

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

см. выше

Ну смотрим. Никакого там pdftk не видим. Завираетесь.

А так, ну будет текст, можно обработать, чистый бинарь — не всегда, надо минимум 2 неиспользованных символа. Напишите программу на обработку на «любой объект» — получите.

Странный ты, ананимус. Бегаешь за мной по всем топикам и жизнь расходуешь на попытки чего-то обязательно поперечить. Получается плохо, грустно и вообще печалит за человечество. Нет чтобы что-то полезное в этой жизни сделать...

vodz ★★★★★
() автор топика
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

Ну смотрим. Никакого там pdftk не видим.

Не там смотришь: sed, который «я так вижу» (комментарий)

Бегаешь за мной

Да обстись.

что-то полезное

А вот это (о чём я спрашиваю сейчас) как раз полезное (очень полезное).

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

Не там смотришь:

У меня нет ncsplit и нет желания раскапывать, что именно там вам надо, сам текст того комментария и откоментировал уже как понял. Если вас устраивает, то что делает ваш скрипт, то зачем вам на это другой комбайн?

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

А вот это (о чём я спрашиваю сейчас) как раз полезное (очень полезное)

Сделать постфактум оглавление (черновик оглавления) для склееного из глав pdftk файла? Полезно наверно, но на первый взгляд задача не тривиальная. Хотя может и реальная, попробовать можно, пригодится ли для этого bsed или такая-то-матерь – пожуём увидим. Хотя если клеишь сам, скрипт, который будет делать такое оглавление по списку pdf файлов – логичнее. И там bsed вроде совсем уж ни к чему.

А если не сам, то откуда уверенность, чем клеили? В общем мутная задача, скрипт для до pdftk наверное сделаю «товарного» вида и выложу на github.

be_nt_all ★★
()
Последнее исправление: be_nt_all (всего исправлений: 1)
Ответ на: комментарий от vodz

нет ncsplit

Да, неувязочка вышла. ncsplit - это то же самое в отношении cslpit, что и твойbsedв отношенииsed`. Неудачно я так упредил, не надо было делать замену и оставить строку исходной:

mkdir po; csplit -n 4 -f po/obj. temp.pdf /obj/ /endobj/1 '{*}'
anonymous
()
Ответ на: комментарий от be_nt_all

Сделать постфактум оглавление (черновик оглавления) для склееного из глав pdftk файла?

Нет. Поменять объекты PDF-ки на некие другие (похожие, но другие).

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

Реверсингом собранных предположительно pdftk pdf заниматься? Не, нафик-нафик. Берём главы будущей книжки в pdf, напускаем на это дело скрипт, который считает страницы в этих главах, делаем оглавление для вшивания тем-же pdftk, чисто по номерам страниц, надо поменять главу, меняем по номерам страниц тем же pdftk, пересчитывая страницы оглавления…

Или я не прав, и зачем-то стоит лезть вовнутрь pdf? Но зачем? Чем плохая предложенная мной вполне unix-вейная схема?

be_nt_all ★★
()
Последнее исправление: be_nt_all (всего исправлений: 1)
Ответ на: комментарий от anonymous

Поменять объекты PDF-ки на некие другие (похожие, но другие).

Да ну нафиг, когда я вижу PDF, у меня закипает идисинкразия и никакого желания в их нутрях копаться не возникает. Делайте что хотите, но без меня.

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

зачем-то стоит лезть вовнутрь pdf?

Тебе вся кухня нужна? Ну хорошо:

Берём отдельный объект PDF-ки: ничто иное как JPEG размером 1M. Смотрю я на этот JPEG, матерюсь на публикаторов, увеличиваю его в двое, перевожу в BW-tiff размером 100k и конвертю в PDF. После этого подменяю старый объект объектом из новой PDF-ки.

Вот и вся кухня.

PS: Дело не в размере PDF, а в тормозах при просмотре (но и в размере тоже, но в основном в тормозах).

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

Было бы для себя - не писали бы на форум. А так понятно - поддерживать не хочется, а чтобы по головке погладили хочется.

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

Было бы для себя - не писали бы на форум.

А в форум вы для кого пишете? Не для себя ли?

А так понятно - поддерживать не хочется, а чтобы по головке погладили хочется.

Отож. Когда-то и linux был в виде курсовой и был опубликован в рассылке, но я на такое и не замахивался.

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

Берём отдельный объект PDF-ки: ничто иное как JPEG размером 1M. Смотрю я на этот JPEG, матерюсь на публикаторов, увеличиваю его в двое, перевожу в BW-tiff размером 100k и конвертю в PDF. После этого подменяю старый объект объектом из новой PDF-ки.

Ну и у меня такое бывает. Но куда тут примкнуть bsed?

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

В общем если это нужно не для сборки самодельных (технических или не очень) ибуков, а для чего иного, то я пас. А если таки для того, то могу собрать то, что описал выше в некий гм… программный пакет с управлением через командную строку и некое простое GUI (на Tcl/Tk к примеру). С работой как с pdf (с помощью pdftk, gs ну и чего придётся), так и djvu (djvused etc). В общем если кому кроме меня интересно – займусьи как будет что показать, на лоре отпишусь.

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

Но куда тут примкнуть bsed?

Если он способен сработать как csplit и даже лучше (в плане названий кусков), то очень даже есть куда примкнуть.

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

Берём отдельный объект PDF-ки: ничто иное как JPEG размером 1M. Смотрю я на этот JPEG, матерюсь на публикаторов, увеличиваю его в двое, перевожу в BW-tiff размером 100k и конвертю в PDF. После этого подменяю старый объект объектом из новой PDF-ки.

и напускаю на всё это дело minidjvu. Profit! Другое дело, что если в pdf был корректно распознанный текстовый слой, то надо бы написать утилиту для корректного его переноса в djvu, но это тоже скорее всего задача где bsed места не найдётся.

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

Если он способен сработать как csplit и даже лучше (в плане названий кусков), то очень даже есть куда примкнуть.

Я вроде на это уже отвечал, если есть текст, где можно надёргать имена и туда сохранять из этого или других текстов, то — запросто. Накрайняк можно сделать самопрограммирование, когда bsed будет формировать скрипт с cp/mv.

vodz ★★★★★
() автор топика
Последнее исправление: vodz (всего исправлений: 2)
Ответ на: комментарий от be_nt_all

Другое дело, что если в pdf был корректно распознанный текстовый слой

Опять не угадал. PDF-ка то нормальная, то бишь не какой то там скан. Но с иллюстрациями господа публиканты накосячили. Там где сам всевышний велит: вставь BW-tiff - фигачат JPEG-и.

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

то — запросто.

Просто я эту прогу не то что не щупал, впервые вижу. Ты единственный по ходу кто знаком с её работой. Другого источника инфы под свои нужды я пока не узрел.

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

PDF-ка то нормальная, то бишь не какой то там скан. Но с иллюстрациями господа публиканты накосячили

Ок, бывает и такое. Хотя если это вся страница такая, то кто мешает просто сделать замену страницы всё тем же pdftk? Или я чего-то не понимаю? Ну а если нет, надо смотреть, что там и как (когда картинка тне на всю страницу – случай уже не редкий)

be_nt_all ★★
()
Последнее исправление: be_nt_all (всего исправлений: 1)
Ответ на: комментарий от be_nt_all

если это вся страница такая, то кто мешает просто сделать замену страницы всё тем же pdftk?

«Эврика! Как я сам не догадался!»

Разница между «страница» и «иллюстрация» по-моему всё-таки есть. Не?

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

Разница между «страница» и «иллюстрация» по-моему всё-таки есть. Не?

Есть. Зачем тогда было вообще pdftk упоминать? Или он умеет работать с объектами меньше страницы и я маны невнимательно читал?

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

Зачем тогда было вообще pdftk упоминать?

Затем, что он форматирует размётку PDF в удобный для csplit вид.

он умеет работать с объектами меньше страницы

Нет. Это я умею работать с объектами меньше страницы. Как? Читай выше.

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

Когда-то и linux был в виде курсовой и был опубликован в рассылке

Вот только сейчас это с одной стороны для Линуса вполне себе источник хлеба с маслом, а с другой – он для поддержки этих исходников git и наисал. Ну а без git’а бы никакого гитзаба и не было бы. Но это я так, мыслию по древу, не обращайте внимание.

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

он форматирует размётку PDF в удобный для csplit вид.

Спасибо, понял, посмотрю.

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

наработки по замене иллюстраций в pdf?

pdftk my_doc.pdf cat 1-end output temp.pdf
mkdir po; csplit -n 4 -f po/obj. file.pdf /obj/ /endobj/1 '{*}'
cd po
mkdir j; for tf in *; do [ "$(grep DCTDecode $tf)" ] && mv -v $tf j; done
cd j;
for tf in obj.????; do mv -fv $tf.s.01.jpg $tf.s.01; done

Для начала хватит.

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

Вот только сейчас это с одной стороны для Линуса вполне себе источник хлеба с маслом

Так то сейчас, а тогда разве он предпологал?

а с другой – он для поддержки этих исходников git и наисал.

На cvs/svn можно получить идиосинкразию даже если они вас полностью устраивают по функционалу, да :) Но вспоминается, что возгласов «зачем ещё один» было достаточно. А взял и сделал так, как он видит для себя версионер с коллективной разработкой, бесплатный.

Ну а без git’а бы никакого гитзаба и не было бы.

Ну всяких freshmeat и прочих sourceforge и сейчас достаточно.

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

Спасибо, с утра поэксперементирую с этим, самому ж интересно.

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

наработки по замене иллюстраций в pdf?

Лучше по новой, а то понафигачил непойми чего:

pdftk my_doc.pdf cat 1-end output temp.pdf
mkdir po; csplit -n 4 -f po/obj. temp.pdf /obj/ /endobj/1 '{*}'
cd po
mkdir j; for tf in *; do [ "$(grep DCTDecode $tf)" ] && mv -v $tf j; done
cd j;
for tf in obj.*; do csplit -f $tf.s. $tf /stream/1 /endstream/; done
for tf in *.s.01; do cp -fv $tf $tf.jpg; done

Теперь порядок.

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

Вернул 2007-й.

Я уже писал, 1997 как минимум (особенно если перейти на каталог выше и посмотреть на крутящуюся гифку с new! рядом с этой публикацией), но это само по себе совсем не плохо.

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