удалите комментарии из xml-файла и pretty-print
У меня есть огромный XML-файл, который содержит много комментариев.
каков "лучший способ" удалить все комментарии и красиво отформатировать xml из командной строки linux?
5 ответов
вы можете использовать tidy
$ tidy -quiet -asxml -xml -indent -wrap 1024 --hide-comments 1 tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<user username="qwerty" password="ytrewq" roles="manager-gui" />
</tomcat-users>
запустите XML через идентификационными данными, преобразовывают XSLT, с пустым шаблоном для комментариев.
все содержимое XML, за исключением комментариев, будет передано в выходные данные.
для того, чтобы отформатировать вывод, установите output @indent= "yes":
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!--Match on Attributes, Elements, text nodes, and Processing Instructions-->
<xsl:template match="@*| * | text() | processing-instruction()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!--Empty template prevents comments from being copied into the output -->
<xsl:template match="comment()"/>
</xsl:stylesheet>
вы можете посмотреть на . Оно имеет несколько вариантов (один из которых --format
сделает довольно печать), но я не могу понять, как удалить комментарии с помощью этого инструмента.
кроме того, проверьте XMLStarlet куча инструментов командной строки, чтобы сделать все, что вы хотели бы с XML. Тогда сделай:
xml c14n --without-comments # XML file canonicalization w/o comments
редактировать: OP в конечном итоге использовал эту строку:
xmlstarlet c14n --without-comments old.xml > new.xml
чтобы убрать что-то простое, как сервер Tomcat.xml, я использую
sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '' | grep -v "^\s*$"
т. е.
function tidy() {
echo "$( cat | sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '' | grep -v "^\s*$")"
}
tidy server.xml
... печать XML без комментариев.
Примечание: хотя он работает достаточно хорошо для простых вещей, он потерпит неудачу с некоторыми блоками CDATA и некоторыми другими ситуациями. Используйте его только для управляемых XML-скриптов, которые не нуждаются и никогда не будут нуждаться в побеге одного <--
или -->
в любом месте!
первый sed отмечает начало и остановку комментария с символами 0x0, затем grep с -z
обрабатывает 0x0 как единственный разделитель строк, ищет строки, начинающиеся с комментария, это-V инвертирует фильтр, оставляя только значимые строки. Наконец,tr -d
\0 ' удаляет все эти 0x0, и чтобы отполировать его, другой grep удаляет пустые строки: voila.
лучшим способом было бы использовать синтаксический анализатор XML для правильной обработки всех неясных угловых случаев. Но если вам нужно что-то быстрое и грязное, существует множество короткие решения с использованием Perl regexes что может быть достаточно.