lqp - редактирование fb2 из скриптов
February 19th, 2009
03:07 pm

[Link]

Previous Entry Add to Memories Tell A Friend Next Entry
редактирование fb2 из скриптов
Нашел-таки наконец, как заменять поля в описания fb2-книги. Как я и подозревал, нужно было покопаться покопаться в имеющимся под юниксами обще-XMLном софте.

Менять поля XML-документа позволяет программка xmlstarlet. Ниже приводится пример скрипта, который меняет имя автора и - если задано - название книги на заданные в командной строке, попутно создавая соответствующие поля если их почему-то нет. Теперь бы еще сообразить, как правильнее все это использовать.


#!/bin/bash
# arguments filename last-name first-name middle-name book-title
FILE=$1
TMP=‘/bin/tempfile’

# Кодировка
ENCODING=‘head -1 “${FILE}”|sed ’s|.*encoding=“\([0-9A-Za-z-]*\)”.*|\1|‘|tr A-Z a-z’
NEWLAST=‘echo $2 |iconv -f koi8-r -t ${ENCODING}’
NEWFIRST=‘echo $3 |iconv -f koi8-r -t ${ENCODING}’
NEWMIDDLE=‘echo $4 |iconv -f koi8-r -t ${ENCODING}’
NEWTITLE=‘echo $5 |iconv -f koi8-r -t ${ENCODING}’

# по хорошему надо бы вставить проверку на версию, подставлять соответствующий URL
XMLNS=“http://www.gribuser.ru/xml/fictionbook/2.0

# количество авторов.
ANUM=‘xmlstarlet sel -N x=“$XMLNS” -t -v “count(//x:title-info/x:author)” ${FILE}’
if [ 1 -lt ${ANUM} ]
then
# для безопасности пока не обрабатываем файлы с несколькими авторами
exit 1
fi

cat ${FILE}|
if [ 1 -gt ${ANUM} ]
then
xmlstarlet ed -N x=“$XMLNS” -s “//x:title-info” -t elem -n author -v “"
else
xmlstarlet ed -N x=”$XMLNS“ -d ”//x:title-info/x:author/*“
fi |
xmlstarlet ed -N x=”$XMLNS“ \
-s ”//x:title-info/x:author“ -t elem -n last-name -v ”${NEWLAST}“ \
-s ”//x:title-info/x:author“ -t elem -n first-name -v ”${NEWFIRST}“ \
-s ”//x:title-info/x:author“ -t elem -n middle-name -v ”${NEWMIDDLE}“ \
|
if [ -n ”${NEWTITLE}“ ]
then
xmlstarlet ed -N x=”$XMLNS“ \
-d ”//x:title-info/x:book-title“ \
-s ”//x:title-info“ -t elem -n book-title -v ”${NEWTITLE}“
else
cat
fi > ${TMP}
mv ${TMP} ${FILE}

(6 comments | Leave a comment)

Comments
 
From:[info]max630.livejournal.com
Date:February 19th, 2009 - 09:46 am
(Link)
с xsltproc проще, по-моему
From:[info]lqp
Date:February 19th, 2009 - 10:49 am
(Link)
Пример?
[User Picture]
From:[info]vitus-wagner.livejournal.com
Date:February 19th, 2009 - 11:19 am
(Link)
Сложнее. То что в xmlstarlet one-liner, в xslt - one-pager.
[User Picture]
From:[info]yushi
Date:February 19th, 2009 - 04:33 pm
(Link)
XSLT для преобразования fb2 -> fb2 это, ИМХО, из пушки по воробьям. Многовато возни для замены одного поля.
[User Picture]
From:[info]vitus-wagner.livejournal.com
Date:February 19th, 2009 - 11:19 am
(Link)
A-a-a! sed для xml!!!

Спасибо, буду знать.
[User Picture]
From:[info]er2000
Date:February 19th, 2009 - 11:47 pm
(Link)
o! spasibo, kzhetsya ya takoi kak raz iskal.
Powered by LJ.Rossia.org