Мне нужно обновить конкретное значение в xml автоматически с помощью сценария bash. В моем xml-файле много похожих строк, например:
<xml>
<main>
<buildElement name = "test_one" version = "" path = "" />
<buildElement name = "test_two" version = "" path = "" />
</main>
</xml>
Мне нужно найти имя элемента "test_one" и отредактировать версию. Я пытаюсь это, но это не помогает:
Ожидаемый результат:
<xml>
<main>
<buildElement name = "test_one" version = "some_value" path = "" />
<buildElement name = "test_two" version = "" path = "" />
</main>
</xml>
Я пытаюсь получить это с помощью xmlstarlet и sed, но не работает, например:
xmlstarlet edit --update '//xml/main/buildElement/name = "test_one"/version' --value 'some_value' myXML.xml
Ваш синтаксис xpath неверен. Вам нужно использовать @
для ссылки на атрибуты, а для поиска определенного элемента вам нужно выражение фильтра. Вы хотите:
xmlstarlet edit --update \
'//xml/main/buildElement[@name = "test_one"]/@version' \
-v some_value myXML.xml
Что выведет:
<?xml version = "1.0"?>
<xml>
<main>
<buildElement name = "test_one" version = "some_value" path = ""/>
<buildElement name = "test_two" version = "" path = ""/>
</main>
</xml>
хорошо, я решил свою проблему, изменив параметры - xmlstarlet ed --inplace -u
'//xml/main/buildElement/name = "test_one"/version'
Вы хотите
'//xml/main/buildElement[@name = "test_one"]/@version'
(По сути, вы, кажется, догадываетесь, и на XPath вы далеко не продвинетесь. Почитайте немного.)
спасибо, я использую это, но... я вижу изменения в печати консоли, но не в файле. Почему это не хранится в файле?