Shell脚本找到&替换xml中的值

时间:2012-09-21 03:46:22

标签: xml shell scripting sed awk

我有一个名为config.xml的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脚本,用$ 1,$ 2,$ 3配置“server-ip”,“server-port”和“import-path”的值:

#!/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 “....你能帮助它运作并最终获得更好的解决方案吗?

4 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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."

答案 2 :(得分:0)

/ home / bbb中的斜杠正在抛弃(我假设你遇到了同样的问题,因为你没有说为什么它不起作用)。

如果你对输入有信心,你可以先逃避斜线。为此可能更好地启动perl,ruby等。

答案 3 :(得分:0)

我真的建议使用像xmlstarlet这样的东西。 (http://xmlstar.sourceforge.net/)对于原始问题,句点和'/'将被替换为sed命令。他们需要逃脱,但你不可能知道他们是否会存在。我会再看一下,但是如果可以的话,可以使用xmlstarlet,或者除了用于xml的sed之外的其他工具。