从bash shell编辑XML文件

时间:2016-10-20 11:12:01

标签: linux bash shell

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

输入文件(将存储在服务器中):

<?xml version="1.0" encoding="UTF-8"?>
<properties>
	<directories installDir="/fs0/">
		<directoriesInstance id="sharedDir" path=""/>
		<directoriesInstance id="loaderInput" path="/fs0/share/iad/input"/>
		<directoriesInstance id="loaderProcessing" path="/fs0/share/iad/processing"/>
		<directoriesInstance id="loaderError" path="/fs0/share/iad/error"/>
		<directoriesInstance id="loaderCompleted" path="/fs0/share/iad/completed"/>
	</directories>
  
  <applicationServerInstance id="app" serviceName="App Server" rmiPort="15001" jvmParameters="-Xmx3072m -Xms512m -XX:-UseGCOverheadLimit -XX:MaxPermSize=196m -Dsun.lang.ClassLoader.allowArraySyntax=true -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/fs0/clarity1/clarity/logs -Xloggc:/fs0/clarity1/clarity/logs/app_gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Dcustom.properties=/fs0/share/custom.properties" maxThreads="1000" programParameters="" distributed="false" runJobScheduler="false" useSSO="true" maxConcurrentJobs="10" runProcessEngine="false" messageTimeToLive="120" messageReceiverInterval="5" exceptionRunInterval="normal" maxXmlNodesLimit="150000"/>
  <applicationServer>
		<applicationServerInstance id="app" serviceName=" App Server" rmiPort="15001" jvmParameters="-Xmx3072m -Xms512m -XX:-UseGCOverheadLimit -XX:MaxPermSize=196m -Dsun.lang.ClassLoader.allowArraySyntax=true -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/fs0/clarity1/clarity/logs -Xloggc:/fs0/clarity1/clarity/logs/app_gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Dcustom.properties=/fs0/clarity1/share/custom.properties" maxThreads="1000" programParameters="" distributed="false" runJobScheduler="false" useSSO="true" maxConcurrentJobs="10" runProcessEngine="false" messageTimeToLive="120" messageReceiverInterval="5" exceptionRunInterval="normal" maxXmlNodesLimit="150000"/>
	</applicationServer>

</properties>

在上面的代码片段中,我想搜索applicationServerInstance标签,看看它是否在jvmproperties标签中有Dcustom.properties = / fs0 / clarity1 / share / custom.properties - 如果它不存在我想添加到文件中保存文件。 所有都应该在bash shell脚本中。

我想将 -Dcustom.properties = / fs0 / share / custom.properties 值添加到 jvmParameters 属性 applicationServerInstance 标记中不存在。在上面的例子中它有这个值,但是如果它不存在我想要添加这个 -Dcustom.properties = / fs0 / share / custom.properties 值。

比如说我应该将 -Dcustom.properties = / fs0 / share / custom.properties 值添加到 jvmParameters 属性 applicationServerInstance 标记到以下代码段。

<applicationServerInstance id="app" serviceName=" App Server" rmiPort="15001" jvmParameters="-Xmx3072m -Xms512m -XX:-UseGCOverheadLimit -XX:MaxPermSize=196m -Dsun.lang.ClassLoader.allowArraySyntax=true -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/fs0/clarity1/clarity/logs -Xloggc:/fs0/clarity1/clarity/logs/app_gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC " maxThreads="1000" programParameters="" distributed="false" runJobScheduler="false" useSSO="true" maxConcurrentJobs="10" runProcessEngine="false" messageTimeToLive="120" messageReceiverInterval="5" exceptionRunInterval="normal" maxXmlNodesLimit="150000"/>

2 个答案:

答案 0 :(得分:0)

在XML文件中,第一个applicationServerInstance标记具有带-Dcustom.properties = / fs0 / share / custom.properties值的jvmParameters。但是在第二个applicationServerInstance标记中,jvmParameter具有-Dcustom.properties = / fs0 / clarity1 / share / custom.properties值而不是-Dcustom.properties = / fs0 / share / custom.properties。在这种情况下,我的代码片段再添加一个Dcustom.properties值。

所以第二个applicationServerInstance标签将是这样的。

<applicationServerInstance id="app" serviceName=" App Server" rmiPort="15001" jvmParameters="-Xmx3072m -Xms512m -XX:-UseGCOverheadLimit -XX:MaxPermSize=196m -Dsun.lang.ClassLoader.allowArraySyntax=true -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/fs0/clarity1/clarity/logs -Xloggc:/fs0/clarity1/clarity/logs/app_gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Dcustom.properties=/fs0/clarity1/share/custom.properties -Dcustom.properties=/fs0/share/custom.properties" maxThreads="1000" programParameters="" distributed="false" runJobScheduler="false" useSSO="true" maxConcurrentJobs="10" runProcessEngine="false" messageTimeToLive="120" messageReceiverInterval="5" exceptionRunInterval="normal" maxXmlNodesLimit="150000"/>

Bash脚本:

#!/usr/bin/env bash

file_name="/home/selvam/Scripts/test.xml"
for i in $(grep -nE "<applicationServerInstance.*jvmParameters" $file_name | cut -d ':' -f1)
do
    jvm_parameters=$(head -$i $file_name | tail -1 | awk -F '"' '{ for (c=1; c<=NF; c++) if ($c ~ /jvmParameters/) print $(c+1)}')
    echo $jvm_parameters | grep -q 'Dcustom.properties=/fs0/share/custom.properties'
    if ([ $? -ne 0 ]) then
        jvm_new_parameters=$(echo $jvm_parameters -Dcustom.properties=/fs0/share/custom.properties)
        sed -i "${i}s%jvmParameters=\"$jvm_parameters\"%jvmParameters=\"$jvm_new_parameters\"%" $file_name
    fi
done

答案 1 :(得分:0)

<强> AWK

awk -F"jvmParameters=" '{if((/applicationServerInstance/)&&($2!~/Dcustom.properties/)){sub("PrintHeapAtGC","PrintHeapAtGC -Dcustom.properties=/fs0/share/custom.properties")}print}' $inputfile

将是另一种解决方案。将$ inputfile替换为您要处理的文件的名称。