2012-09-21 70 views
1

替換值我有一個XML配置文件名爲config.xml中:shell腳本查找和在XML

<?xml version="1.0" encoding="UTF-8"?> 
<config> 
    <server-ip>192.168.1.45</server-ip> 
    <server-port>1209</server-port> 
    <repository-temp-path>/home/john</repository-temp-path> 
</config> 

我有一個shell腳本來配置「服務器IP」的價值觀,以「服務器端口「和 」導入路徑「 以$ 1,$ 2,$ 3:

#!/bin/sh 
if [ $# -ne 3 ];then 
echo "usage: argument 1:IP_Address 2:Server_PORT 3:Temp_PATH" 
exit 1 
fi 
IP=$1 
PORT=$2 
DIRT=$3 

echo "Change values in config.xml..." 

sed "s/<server-ip>.*<\/server-ip>/<server-ip>$IP<\/server-ip>/;s/<server-port>.*<\/server-port>/<server-port>$PORT<\/server-port>/;s/<repository-temp-path>.*<\/repository-temp-path>/<repository-temp-path>$DIRT<\/repository-temp-path>/" config.xml > config2.xml 

echo "Done." 

但它僅適用於該」 $ ./abc.sh ABC 「而不是工作的」 $ ./abc。 sh 192.168.1.6 9909/home/bbb「....你能幫助它工作並最終得到一個解決方案更好

+0

XSLT將是這個更好的方法。是否像xsltproc不可用? – ziesemer

+0

我發現它可以使用兩個反斜槓:「$ ./abc.sh 192.168.1.6 9909 \\/home \\/bbb」,但仍無法使用:「$ ./abc.sh 192.168.1.6 9909 $ HOME \\/bbb「 – xoyoja

+0

@ziesemer,是的,但我不熟悉它。你能提供.xsl嗎?謝謝。適用於OS X用戶的 – xoyoja

回答

2

這可能會爲你工作:

#!/bin/sh 
if [ $# -ne 3 ];then 
echo "usage: argument 1:IP_Address 2:Server_PORT 3:Temp_PATH" 
exit 1 
fi 
IP=$1 
PORT=$2 
DIRT=$3 

echo "Change values in config.xml..." 

cat <<EOF >config2.xml 
<?xml version="1.0" encoding="UTF-8"?> 
<config> 
    <server-ip>${IP}</server-ip> 
    <server-port>${PORT}</server-port> 
    <repository-temp-path>${DIRT}</repository-temp-path> 
</config> 
EOF 

echo "Done." 
0

在/ home/bbb中的斜槓正在拋棄它(我假設你遇到了同樣的問題,因爲你沒有說爲什麼它不工作)。

如果您對輸入信心滿滿,那麼您可以先跳過斜槓。可能會更好地激發Perl,紅寶石等。

2

XML + SHELL = XMLStarlet

$ xmlstarlet ed -u /config/server-ip -v 192.168.1.6 -u /config/server-port -v 9909 -u /config/repository-temp-path -v /home/bbb input.xml 
<?xml version="1.0" encoding="UTF-8"?> 
<config> 
    <server-ip>192.168.1.6</server-ip> 
    <server-port>9909</server-port> 
    <repository-temp-path>/home/bbb</repository-temp-path> 
</config> 
+0

:'brew install xmlstarlet' – fwonce

0

我真的建議使用像xmlstarlet。 (http://xmlstar.sourceforge.net/)對於原始問題,句點和'/'正被代入到sed命令中。他們需要逃脫,但你不可能知道他們是否存在或不存在。我會多看一些,但如果可以的話,還可以使用xmlstarlet或除sed之外的其他工具。