2017-01-02 7 views
0

Мне нужен скрипт 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 с regexing, но это не обеспечивает результат я хочу. Я работаю над OSX 10.12.

+2

Вы что-то пробовали? –

+1

Вы проверили XML-парсер? – fedorqui

+0

Если значение для изменения присутствует только один раз в вашем файле, просто «sed -i»/oldvalue/newvalue/'file.xml' достаточно – Aserre

ответ

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 для на месте подстановка файла.

+0

Спасибо. Это работает :) Два вопроса. 1) Есть ли способ сделать это без xmlstarlet? Есть машины, у которых его нет. 2) Есть ли хороший трюк regex для обновления только части THIS_ONE_NEED_TO_BE_UPDATED? – Stas

+0

@StasS: Обратитесь к моему обновлению, которое должно решить вашу проблему, – Inian