Есть ли инструмент командной строки, который может удалить комментарии из XML-файла? Или мне нужно написать небольшую программу, которая использует XML-парсер для этого?
Обновлять: Меня не интересуют решения, которые обрабатывают только подмножество всех возможных XML-файлов.
Например, регулярное выражение не может обрабатывать XML-анализ.
решение1
Я бы сделал это так:
cat myfile.xml | sed '/<!--.*-->/d' | sed '/<!--/,/-->/d' > cleaned.xml
Или:
awk 'in_comment&&/-->/{sub(/([^-]|-[^-])*--+>/,"");in_comment=0}
in_comment{next}
{gsub(/<!--+([^-]|-[^-])*--+>/,"");
in_comment=sub(/<!--+.*/,"");
print}'
Или:
xmlstarlet ed -d '//comment()' file.xml
решение2
Чтобы расширить верхний ответ. Если вы хотите удалить только комментарий, а не всю строку, вам, вероятно, следует использовать:
sed 's/<!--.*-->//'
В моем случае у меня был минифицированный XML-файл, все содержимое которого находилось в одной строке, и поскольку предыдущее решение удалило бы всю строку, в которой находился комментарий, это полностью очистило бы мой файл.
решение3
Это полезно для удаления многострочных комментариев (например, проваленных тестов) из XML-файла, по крайней мере тех, которые вы выбрали вручную и которые полезны конечному пользователю:
perl -i -w -0777pe 's/<!--(.(?<!(HELP|TODO)))*?-->//sg' somefile.xml
больше о связанных регулярных выражениях:https://stackoverflow.com/a/1240293/1422630
Если есть способ получить тот же результат, но с помощью xmlstarlet, я бы предпочел это, поскольку могут быть какие-то исключения, которые regex может не обработать, но на данный момент мне придется использовать именно это.