Извлечь оглавление файла epub

Вот один из способов сделать это с помощью sed :

sed '/Os version rhel5\.6/{
a\
apache 4.2
$!{
n
/^apache 4\.2$/d
}
}' infile

Это добавляет apache 4.2 безусловно для всех строк, соответствующих Os версии rhel5.6 , затем (если не в последней строке) он вставляет следующую строку через n (печать пространства шаблонов) и если новое содержимое пространства шаблонов совпадает с apache 4.2 , оно удаляется. При необходимости отрегулируйте регулярное выражение, чтобы включить начальные / конечные пробелы, например. / ^ [[: blank:]] * apache 4 \ .2 [[: blank:]] * $ / d

3
20.05.2016, 00:53
1 ответ

Хотя ответ, предоставленный @cas, работает в в некоторых случаях он основан на предположении о версии 2.0 epub с документом NCX с именем toc.ncx на верхнем уровне zip-контейнера. Из 223 файлов epub, которые у меня есть в одной папке, только 5 соответствуют этому предположению - и они содержат его только для совместимости со старыми системами чтения. toc.ncx не является обязательным файлом - требуется только META-INF / content.xml . Он будет содержать указатели на все остальные элементы epub. Это делает написание сценариев через bash немного более сложным, но возможным. Вот сценарий, который извлекает название и автора из файла opf (на который указывает content.xml):

#! /bin/sh

for f in "$@" ; do
    echo -n "$f""   "
    opf=$(unzip -p "$f" META-INF/container.xml | 
        xml2 | 
        sed -n -e 's:^/container/rootfiles/rootfile/@full-path=::p')
    unzip -p "$f" "$opf" |
        xml2 |
        sed -n -e 's!^/package/metadata/dc:title=!  !p' | tr  '
' ' '
    unzip -p "$f" "$opf" |
        xml2 |
        sed -n -e 's!^/package/metadata/dc:creator=!    !p' | tr  '
' ' '
    echo
done

Да, он дважды анализирует opf , чтобы обеспечить порядок результатов - это создает файл с тремя столбцами, разделенный табуляцией (это табуляции в строках sed между двумя ударами), подходящий для импорта электронной таблицы.

Сделать еще один шаг, чтобы найти файл ncx, немного сложнее, поскольку использование xml2 для генерации одной строки для каждого тега и атрибута работает против нас: нам нужно значение атрибута href , который является Атрибут media-type равен application / x-dtbncx + xml .Мы можем немного обмануть и надеяться, что исходный элемент находится в одной строке, и использовать grep для извлечения только этого фрагмента, а затем обработать его с помощью xml2, чтобы получить значение href.

Поскольку это относительный URL-адрес, нам также необходимо извлечь часть пути из записи opf. Объединение всего этого дает нам:

#! /bin/sh

for f in "$@" ; do
    echo "$f""  "
    opf=$(unzip -p "$f" META-INF/container.xml | 
        xml2 | 
        sed -n -e 's:^/container/rootfiles/rootfile/@full-path=::p')
    ncx=$(unzip -p "$f" "$opf" |
        grep application/x-dtbncx+xml| 
        xml2 |
        sed -n -e 's!^/item/@href=!!p')
    opf_filename=${opf##*/}
    opf_path=${opf%$opf_filename}
    unzip -p "$f" ${opf_path}${ncx} |
        xml2 |
        sed -n -e 's:^/ncx/navMap/navPoint/navLabel/text=:  :p
                   s!^/ncx/docTitle/text=!Title: !p'
done

Это все еще делает предположения, самое сильное из которых состоит в том, что это файлы, совместимые с epub2, и, следовательно, где-то содержат файл ncx. В документах Epub3 используется другой формат навигации на основе HTML. Тем не менее, у меня есть оглавления для всех 223 моих тестовых файлов (хотя у некоторых нет заголовков в ncx)

1
27.01.2020, 21:13

Теги

Похожие вопросы