在Linux下如何用Shell腳本讀寫XML?現有一個config.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 >
< config >
< server-ip >192.168.1.45 </ server-ip >
< server-port >1209 </ server-port >
< repository-temp-path >/home/john </ repository-temp-path >
</ config >
需要修改里面的"server-ip", "server-port" and "import-path",用Shell腳本的參數$1,$2,$3來寫入。
思路1:用sed實現
首先想到的就是用sed正則匹配替換實現,寫了一個shell腳本,是這樣的:
#
!/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 > config.xml
echo " Done. "
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 > config.xml
echo " Done. "
測試下來調用$ ./abc.sh 192.168.1.6 9909 \\/home\\/abc"是可以的,但環境變量不行,例如:$ ./abc.sh 192.168.1.6 9909 $HOME\\/abc",因為首先環境變量被解析了,所以存在反斜杠轉義字符和sed替換沖突的問題。
用另外一個思路實現
另外一個思路是直接輸出該xml的內容,測試下來很管用,使用很方便,不存在反斜杠轉義字符的問題和環境變量的問題:
#
!/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 >config.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. "
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 >config.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. "
思路3:用XMLStarlet
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>
<?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>
思路4:用xsltproc
很多Linux比如CentOS默認已安裝xsltproc,所以用xslt可以很方便的把一個xml轉換為另外一個xml。具體用法見這個網頁。