
Я хотел бы программно обновить строку в очень простом XML-файле конфигурации, например, так:
<?xml version="1.0"?>
<x>
<z>should be changed</z>
</x>
<y>
<z>should NOT be changed</z>
</y>
Существует ли простая команда CLI, которая обновит x/z, а НЕ y/z? Возможно, с аргументом селектора XPath, например:
$ xml-update myfile.xml /x/z "my new string"
Я мог бы написать что-нибудь на Perl или Python, но, учитывая простоту этой проблемы, полагаю, должна быть какая-то умная утилита Unix, которая это уже делает.
Обновлять: Я нашел это, но это кажется немного излишним. И мне сначала придется изучить XSLT.http://developerblog.redhat.com/2013/12/05/xml-editing-bash-script/
решение1
Вы можете использоватьxml2/2xmlинструменты для обработки XML в командной строке без лишней суеты. xml2
преобразует XML-документ в строчно-ориентированный формат, подходящий для использования с традиционными инструментами обработки текста, такими как awk
или sed
, а затем 2xml
берет этот формат и преобразует его обратно в XML.
Для примера, если я возьму этот документ:
<?xml version="1.0"?>
<doc>
<x>
<z>should be changed</z>
</x>
<y>
<z>should NOT be changed</z>
</y>
</doc>
Выполнение xml2
этого контента дает:
$ xml2 < doc.xml
/doc/x/z=should be changed
/doc/y/z=should NOT be changed
Я могу изменить содержимое элемента <z>
следующим образом:
xml2 < doc.xml |
sed '/\/doc\/x\/z/ s/should be changed/look ma no hands/' |
2xml | tidyp -xml -i -q
Я использую sed
поисковое выражение для явного поиска строки, начинающейся с /doc/y/z
, а затем изменяю содержимое этой строки, что дает нам:
<doc>
<x>
<z>look ma no hands</z>
</x>
<y>
<z>should NOT be changed</z>
</y>
</doc>
Я передал вывод через tidyp
XML-форматер, поскольку в противном случае документ выглядел бы так:
<doc><x><z>look ma no hands</z></x><y><z>should NOT be changed</z></y></doc>
...что синтаксически правильно, но труднее для чтения.