У меня есть этот огромный XML файл, который содержит много комментариев.
Какой "лучший способ" удалить все комментарии и красиво отформатировать xml из командной строки linux?
У меня есть этот огромный XML файл, который содержит много комментариев.
Какой "лучший способ" удалить все комментарии и красиво отформатировать xml из командной строки linux?
вы можете использовать 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>
Вы можете посмотреть инструмент xmllint
. Он имеет несколько опций (один из которых --format
будет делать довольно печатный), но я не могу понять, как удалить комментарии с помощью этого инструмента.
Кроме того, проверьте XMLStarlet, набор инструментов командной строки, чтобы делать все, что вы хотели бы с помощью xml. Затем выполните:
xml c14n --without-comments # XML file canonicalization w/o comments
EDIT: OP в конечном итоге использовал эту строку:
xmlstarlet c14n --without-comments old.xml > new.xml
Чтобы убрать что-то простое, например Tomcat server.xml, я использую
sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0' | grep -v "^\s*$"
т.е.
function tidy() {
echo "$( cat $1 | sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0' | grep -v "^\s*$")"
}
tidy server.xml
... будет печатать xml без комментариев.
ПРИМЕЧАНИЕ. Несмотря на то, что он работает достаточно хорошо для простых вещей, он будет работать с некоторыми блоками CDATA и некоторыми другими ситуациями. Используйте его только для управляемых xml-скриптов, которые не нужны, и вам никогда не понадобится выходить из одного <--
или -->
в любом месте!
Первый знак комментариев sed отмечает и останавливается с 0x0 символами, тогда grep с -z
обрабатывает 0x0 как единственный разделитель строки, ищет строки, начинающиеся с комментария, он -v инвертирует фильтр, оставляя только значимые строки. Наконец, tr -d
\0` удаляет все эти 0x0, а для его полировки другой grep удаляет пустые строки: voila.
Лучшим способом было бы использовать синтаксический анализатор XML, чтобы правильно обрабатывать все неясные угловые случаи. Но если вам нужно что-то быстрое и грязное, существует множество коротких решений с использованием Perl regexes, которые могут быть достаточными.