Patching bean config XML file динамически используя sed? - PullRequest
0 голосов
/ 05 февраля 2011

У меня есть XML-файл конфигурации бина, который выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName">
            <value>MyDriver</value>
        </property>
        <property name="url">
            <value>#####</value>
        </property>
        <property name="username">
            <value>myUser</value>
        </property>
        <property name="password">
            <value>myPassword</value>
        </property>
    </bean>
</beans>

Я хочу динамически заменить строку ##### на sed.

##### может иметь разные значения, например myUrl1, myUrl2 и т. Д. И должны быть заменены другими данными myUrlX

Таким образом, результат должен выглядеть примерно так:

        ...
        <property name="url">
            <value>myUrlX</value>
        </property>
        ...

Пока что я только приблизился к решению с помощью следующей команды sed:

sed -n "1h;1!H;${;g;s|\(<property [^>]*>.*<value>\).*\(</value>.*</property>\)|\1myUrl\2|g;p;}" test.xml

Но это заменяет строку myPassword в моем XML-файле вместо #####.

Может ли кто-нибудь дать мне подсказку, что мне нужно изменить в моей команде sed?

Большое спасибо!

1 Ответ

1 голос
/ 05 февраля 2011

Используйте xmlstarlet :

xml ed --update "/beans/bean[@id='myDataSource']/property[@name='url']/value" --value myUrlX inputfile.xml

Для запроса:

xml sel -t -m "/beans/bean[@id='myDataSource']/property[@name='url']" -v value inputfile.xml

Соедините их:

#!/bin/bash
file=inputfile.xml
val=$(xml sel -t -m "/beans/bean[@id='myDataSource']/property[@name='url']" -v value "$file")
if [[ $val == "foo" ]]
then
    val=bar
    xml ed --update "/beans/bean[@id='myDataSource']/property[@name='url']/value" --value "$val" "$file"
fi

В моей системекоманда xmlstarlet вместо xml.

Не использовать регулярные выражения.

...