我想通过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>
答案 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
来清理文件,以确保<applicationServerInstance
和jvmParameters
位于同一行
-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