我有一个bean配置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
但这取代了我的XML文件中的myPassword
字符串,而不是#####
。
有人能给我一个提示我需要在sed命令中更改的内容吗?
非常感谢!
答案 0 :(得分:1)
使用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
。