Bash скрипт для обновления части значения элемента XML

Мне нужен скрипт bash для обновления части значения элемента XML в соответствии с некоторым другим динамическим свойством.

Например, файл XML:

<?xml version="1.0"  encoding="ISO-8859-1"?>
 <Configure class="org.eclipse.something">
   <Set name="foo">foo-val</Set>
   <Set name="bar">bar-val</Set>
   <Set name="my-elm">/dont/matter/THIS_ONE_NEED_TO_BE_UPDATED</Set>
 </Configure>

Пытался использовать xmlstarlet с регулярным выражением, но он не дает желаемого результата. Я работаю над OSX 10.12.

1 ответ

Решение

С помощью xmlstarlet с ниже xpath выражение работало хорошо для меня. Приведенное ниже выражение выполняет замену в темпе (-L флаг) из XML файл

xmlstarlet edit -L -u "/Configure/Set[@name='my-elm']" -v '/dont/matter/THIS_ONE_NEED_TO_BE_UPDATED' xml-file

Брось -L флаг, чтобы проверить, происходит ли замена правильно, и после успешного добавления добавить то же самое.

Проверено на xmlstarlet (1.6.1) на OS X

Хотя это строго NOT рекомендуется использовать sed за xml обновления, эта логика ниже будет работать для вас,

sed "s/\(<Set name=\"my-elm\".*>\)[^<>]*\(<\/Set.*\)/\1\/dont\/matter\/THIS_ONE_NEED_TO_BE_UPDATED\2/" xml-file

добавить -i.bak для замены файла на месте.

Другие вопросы по тегам