使用shell脚本将值添加到XML文件中的属性

时间:2016-10-22 12:57:03

标签: xml bash shell

我想通过bash shell脚本编辑XML文件。我一直在找一个解决方案 - 如果可以通过bash shell脚本解决这个问题,请分享你的建议。

我想将 -Dcustom.properties = / fs0 / share / custom.properties 值添加到jvmParameters属性中,如果它不存在,则添加到applicationServerInstance标记中。

输入文件:

<?xml version="1.0" encoding="UTF-8"?>
<properties>
  <applicationServer>
        <applicationServerInstance id="app" serviceName=" App Server" rmiPort="15001" jvmParameters="-Xmx3072m" maxThreads="1000" programParameters="" distributed="false"/>
    </applicationServer>
    <blah>
    </blah>
    <blah abc="123">
    </blah>
</properties>

理想的输入文件(上面的文件应该更新如下):

<?xml version="1.0" encoding="UTF-8"?>
<properties>
  <applicationServer>
        <applicationServerInstance id="app" serviceName=" App Server" rmiPort="15001" jvmParameters="-Xmx3072m -Dcustom.properties=/fs0/share/custom.properties" maxThreads="1000" programParameters="" distributed="false"/>
    </applicationServer>
    <blah>
    </blah>
    <blah abc="123">
    </blah>
</properties>

2 个答案:

答案 0 :(得分:1)

使用sed:

sed -i '/<applicationServerInstance/{/-Dcustom\.properties=\/fs0\/share\/custom\.properties/!s/\(jvmParameters="[^"]*\)"/\1 -Dcustom.properties=\/fs0\/share\/custom.properties"/}' file

找到<applicationServerInstance后,如果在该行中找不到-Dcustom.properties=/fs0/share/custom.properties,则会将其作为属性值附加到jvmParameters

正如@ 1sloc在评论中指出的那样,在执行此sed之前,您最好使用例如xmllint来清理文件,以确保<applicationServerInstancejvmParameters位于同一行

-i标志用于编辑文件。

答案 1 :(得分:1)

以@Kenazov提出的答案为基础:

#!/usr/bin/env bash

INPUT=input.xml;
OUTPUT=config.xml

xmllint --format $INPUT |\
sed '/<applicationServerInstance/{/-Dcustom.properties=\/fs0\/share\/custom.properties/!s/\(jvmParameters="[^"]*\)"/\1 -Dcustom.properties=\/fs0\/share\/custom.properties"/}' \
> $OUTPUT