Вот один из способов сделать это с помощью 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
Хотя ответ, предоставленный @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)