|
lqp - редактирование fb2 из скриптов
[Recent Entries][Archive][Friends][User Info]
03:07 pm
[Link] |
редактирование 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}
|
|
| |
с xsltproc проще, по-моему
| From: | lqp |
| Date: | February 19th, 2009 - 10:49 am |
|---|
| | | (Link) |
|
Пример?
Сложнее. То что в xmlstarlet one-liner, в xslt - one-pager.
![[User Picture]](http://lj.rossia.org/userpic/4/5) | | From: | yushi |
| Date: | February 19th, 2009 - 04:33 pm |
|---|
| | | (Link) |
|
XSLT для преобразования fb2 -> fb2 это, ИМХО, из пушки по воробьям. Многовато возни для замены одного поля.
A-a-a! sed для xml!!!
Спасибо, буду знать.
![[User Picture]](http://lj.rossia.org/userpic/221/501) | | From: | er2000 |
| Date: | February 19th, 2009 - 11:47 pm |
|---|
| | | (Link) |
|
o! spasibo, kzhetsya ya takoi kak raz iskal. |
|