2011-02-04 67 views
0

我有一個看起來像這樣一個bean的配置XML文件:使用sed動態修補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來替換字符串#####動態。

#####可以具有不同的值,例如, myUrl1myUrl2等,並應替換爲另一個給出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命令嗎?

非常感謝!

回答

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

Don't use regexes.

+0

非常感謝!這解決了我的問題! – Peter 2011-02-07 20:24:41