【问题标题】:Shell script to find & replace value in xml用于在 xml 中查找和替换值的 Shell 脚本
【发布时间】:2012-09-13 11:44:25
【问题描述】:

我有一个名为 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"....你能帮忙让它工作并最终得到一个更好的解决方案吗?

【问题讨论】:

  • XSLT 将是一个更好的方法。像 xsltproc 这样的东西不可用吗?
  • 我发现它适用于两个反斜杠:“$ ./abc.sh 192.168.1.6 9909 \\/home\\/bbb”,但仍然不适用于:“$ ./abc. sh 192.168.1.6 9909 $HOME\\/bbb"
  • @ziesemer,是的,但我不熟悉它。你能提供.xsl吗?谢谢。

标签: xml shell scripting sed awk


【解决方案1】:

/home/bbb 中的斜杠将其丢弃(我假设您遇到了与我相同的问题,因为您没有说为什么它不起作用)。

如果您对输入有信心,可以先转义斜线。为此启动 perl、ruby 等可能会更好。

【讨论】:

    【解决方案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>
    

    【讨论】:

    • 对于 OS X 用户:brew install xmlstarlet
    【解决方案3】:

    我真的建议使用 xmlstarlet 之类的东西。 (http://xmlstar.sourceforge.net/) 对于原始问题,句点和“/”被替换为 sed 命令。他们需要被逃脱,但你不可能知道他们是否会存在。如果可以的话,我会更深入地研究它,但使用 xmlstarlet 或除 sed 之外的其他用于 xml 的工具。

    【讨论】:

      【解决方案4】:

      这可能对你有用:

      #!/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."
      

      【讨论】:

        猜你喜欢
        • 2011-01-04
        • 2012-06-07
        • 2018-02-01
        • 1970-01-01
        • 2016-03-18
        • 2018-03-07
        • 2012-11-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多