xmlstarlet - 删除 xml 元素 - shell 脚本
xmlstarlet - delete a xml element - shell scripting
我的 XML :
<?xml version='1.0' encoding='UTF-8'?>
<mm2-moduleset plugin="mm2-plugin@2.27.0-SNAPSHOT">
..
<buildType class="hudson.mm.MMModuleSet$Component">
<viewableName>Component</viewableName>
</buildType>
<selectedCodeComponents>
<string>admin-content</string>
<string>admin</string>
</selectedCodeComponents>
<incrementalBuild>false</incrementalBuild>
...
...
</mm2-moduleset>
基本上,我正在尝试从 jenkins-cli 插件获取作业详细信息,并更新 xml 文件的配置(jenkins 作业的配置),然后使用 [= 更新 jenkins 作业39=]-脚本。
为此,我需要使用 shell 脚本根据用户输入替换“selectedCodeComponents”属性的“string”属性值。如果输入是 check, check-content, bank, then
<selectedCodeComponents>
<string>check-content</string>
<string>check</string>
<string>bank</string>
</selectedCodeComponents>
我的代码:
${JAVA_HOME}/bin/java -Djavax.net.ssl.trustStore=${JENKINS_HOST}.keystore -Djavax.net.ssl.trustStorePassword=112012 -jar ./jenkins-cli.jar -s https://$USERNAME:$API_TOKEN\@$JENKINS_HOST:$JENKINS_PORT\/jenkins get-job job_1 > job1.xml
(Jenkins-cli - get-job returns 配置在 xml 文件中)
我想先删除 selectedcodecomponents 中的字符串元素,然后追加用户提供的内容。像这样,
xmlstarlet ed -d "mm2-moduleset/selectedCodeComponents/string" abc.xml
// some logic
xmlstarlet ed -a "mm2-moduleset/selectedCodeComponents/string" --type elem -n string -v "something" abc.xml
但是在执行第一个命令 (xmlstarlet ed -d) 之后,它也会删除选定的代码组件。但我只想删除其中的字符串元素。
<?xml version='1.0' encoding='UTF-8'?>
<mm2-moduleset plugin="mm2-plugin@2.27.0-SNAPSHOT">
..
<buildType class="hudson.mm.MMModuleSet$Component">
<viewableName>Component</viewableName>
</buildType>
</selectedCodeComponents>
<incrementalBuild>false</incrementalBuild>
...
...
</mm2-moduleset>
append 命令也追加两次。(xmlstarlet ed -a )
例如,
xmlstarlet ed -a "mm2-moduleset/selectedCodeComponents/string" --type elem -n string -v "check" abc.xml
<?xml version='1.0' encoding='UTF-8'?>
<mm2-moduleset plugin="mm2-plugin@2.27.0-SNAPSHOT">
..
<buildType class="hudson.mm.MMModuleSet$Component">
<viewableName>Component</viewableName>
</buildType>
<selectedCodeComponents>
<string>admin-content</string>
<string>check</string>
<string>admin</string>
<string>check</string>
</selectedCodeComponents>
<incrementalBuild>false</incrementalBuild>
...
...
</mm2-moduleset>
能否请您告诉我如何只删除 selectedcodecomponents 元素中的字符串元素以及为什么附加命令附加两次
我是 shell 脚本的新手,因此您的建议会对我有所帮助
稍微修复一下示例 XML 文件,给它一个根标签:
$ cat file.xml
<?xml version='1.0' encoding='UTF-8'?>
<root>
<buildType class="hudson.mm.MMModuleSet$Component">
<viewableName>Component</viewableName>
</buildType>
<selectedCodeComponents>
<string>admin-content</string>
<string>admin</string>
</selectedCodeComponents>
<incrementalBuild>false</incrementalBuild>
</root>
你像这样删除 string
个节点
$ xmlstarlet ed -d '//selectedCodeComponents/string' file.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<buildType class="hudson.mm.MMModuleSet$Component">
<viewableName>Component</viewableName>
</buildType>
<selectedCodeComponents/>
<incrementalBuild>false</incrementalBuild>
</root>
然后像这样添加新的字符串子节点
$ xmlstarlet ed -d '//selectedCodeComponents/string' file.xml |
xmlstarlet ed -s '//selectedCodeComponents' -t elem -n string -v something1 |
xmlstarlet ed -s '//selectedCodeComponents' -t elem -n string -v something2 |
xmlstarlet ed -s '//selectedCodeComponents' -t elem -n string -v something3
<?xml version="1.0" encoding="UTF-8"?>
<root>
<buildType class="hudson.mm.MMModuleSet$Component">
<viewableName>Component</viewableName>
</buildType>
<selectedCodeComponents>
<string>something1</string>
<string>something2</string>
<string>something3</string>
</selectedCodeComponents>
<incrementalBuild>false</incrementalBuild>
</root>
1) 如果需要删除整个字符串元素,使用下面的代码
xmlstarlet ed -P -S -d "/mm2-moduleset/.../selectedCodeComponents/string" config.xml >temp.xml
mv temp.xml config.xml
2) 如果您必须删除特定的字符串元素,请使用以下代码
read -p "read the string that need to be deleted" deleteString
xmlstarlet ed -P -S -d "/mm2-moduleset/.../selectedCodeComponents/string[text()='$deleteString']" config.xml >temp.xml
mv temp.xml config.xml
3) 如果你必须根据用户输入替换字符串,你可以试试下面的代码
read - "read the string that need to be modify" modifyString1 modifyString2 modifyString3
xmlstarlet ed -P -S -s "/mm2-moduleset/.../selectedCodeComponents" -t elem -n string -v $modifyString1 -s "/mm2-moduleset/.../selectedCodeComponents" -t elem -n string -v $modifyString2 -s "/mm2-moduleset/.../selectedCodeComponents" -t elem -n string -v $modifyString3 config.xml >temp.xml
mv temp.xml config.xml
我的 XML :
<?xml version='1.0' encoding='UTF-8'?>
<mm2-moduleset plugin="mm2-plugin@2.27.0-SNAPSHOT">
..
<buildType class="hudson.mm.MMModuleSet$Component">
<viewableName>Component</viewableName>
</buildType>
<selectedCodeComponents>
<string>admin-content</string>
<string>admin</string>
</selectedCodeComponents>
<incrementalBuild>false</incrementalBuild>
...
...
</mm2-moduleset>
基本上,我正在尝试从 jenkins-cli 插件获取作业详细信息,并更新 xml 文件的配置(jenkins 作业的配置),然后使用 [= 更新 jenkins 作业39=]-脚本。
为此,我需要使用 shell 脚本根据用户输入替换“selectedCodeComponents”属性的“string”属性值。如果输入是 check, check-content, bank, then
<selectedCodeComponents>
<string>check-content</string>
<string>check</string>
<string>bank</string>
</selectedCodeComponents>
我的代码:
${JAVA_HOME}/bin/java -Djavax.net.ssl.trustStore=${JENKINS_HOST}.keystore -Djavax.net.ssl.trustStorePassword=112012 -jar ./jenkins-cli.jar -s https://$USERNAME:$API_TOKEN\@$JENKINS_HOST:$JENKINS_PORT\/jenkins get-job job_1 > job1.xml
(Jenkins-cli - get-job returns 配置在 xml 文件中)
我想先删除 selectedcodecomponents 中的字符串元素,然后追加用户提供的内容。像这样,
xmlstarlet ed -d "mm2-moduleset/selectedCodeComponents/string" abc.xml
// some logic
xmlstarlet ed -a "mm2-moduleset/selectedCodeComponents/string" --type elem -n string -v "something" abc.xml
但是在执行第一个命令 (xmlstarlet ed -d) 之后,它也会删除选定的代码组件。但我只想删除其中的字符串元素。
<?xml version='1.0' encoding='UTF-8'?>
<mm2-moduleset plugin="mm2-plugin@2.27.0-SNAPSHOT">
..
<buildType class="hudson.mm.MMModuleSet$Component">
<viewableName>Component</viewableName>
</buildType>
</selectedCodeComponents>
<incrementalBuild>false</incrementalBuild>
...
...
</mm2-moduleset>
append 命令也追加两次。(xmlstarlet ed -a ) 例如,
xmlstarlet ed -a "mm2-moduleset/selectedCodeComponents/string" --type elem -n string -v "check" abc.xml
<?xml version='1.0' encoding='UTF-8'?>
<mm2-moduleset plugin="mm2-plugin@2.27.0-SNAPSHOT">
..
<buildType class="hudson.mm.MMModuleSet$Component">
<viewableName>Component</viewableName>
</buildType>
<selectedCodeComponents>
<string>admin-content</string>
<string>check</string>
<string>admin</string>
<string>check</string>
</selectedCodeComponents>
<incrementalBuild>false</incrementalBuild>
...
...
</mm2-moduleset>
能否请您告诉我如何只删除 selectedcodecomponents 元素中的字符串元素以及为什么附加命令附加两次
我是 shell 脚本的新手,因此您的建议会对我有所帮助
稍微修复一下示例 XML 文件,给它一个根标签:
$ cat file.xml
<?xml version='1.0' encoding='UTF-8'?>
<root>
<buildType class="hudson.mm.MMModuleSet$Component">
<viewableName>Component</viewableName>
</buildType>
<selectedCodeComponents>
<string>admin-content</string>
<string>admin</string>
</selectedCodeComponents>
<incrementalBuild>false</incrementalBuild>
</root>
你像这样删除 string
个节点
$ xmlstarlet ed -d '//selectedCodeComponents/string' file.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<buildType class="hudson.mm.MMModuleSet$Component">
<viewableName>Component</viewableName>
</buildType>
<selectedCodeComponents/>
<incrementalBuild>false</incrementalBuild>
</root>
然后像这样添加新的字符串子节点
$ xmlstarlet ed -d '//selectedCodeComponents/string' file.xml |
xmlstarlet ed -s '//selectedCodeComponents' -t elem -n string -v something1 |
xmlstarlet ed -s '//selectedCodeComponents' -t elem -n string -v something2 |
xmlstarlet ed -s '//selectedCodeComponents' -t elem -n string -v something3
<?xml version="1.0" encoding="UTF-8"?>
<root>
<buildType class="hudson.mm.MMModuleSet$Component">
<viewableName>Component</viewableName>
</buildType>
<selectedCodeComponents>
<string>something1</string>
<string>something2</string>
<string>something3</string>
</selectedCodeComponents>
<incrementalBuild>false</incrementalBuild>
</root>
1) 如果需要删除整个字符串元素,使用下面的代码
xmlstarlet ed -P -S -d "/mm2-moduleset/.../selectedCodeComponents/string" config.xml >temp.xml
mv temp.xml config.xml
2) 如果您必须删除特定的字符串元素,请使用以下代码
read -p "read the string that need to be deleted" deleteString
xmlstarlet ed -P -S -d "/mm2-moduleset/.../selectedCodeComponents/string[text()='$deleteString']" config.xml >temp.xml
mv temp.xml config.xml
3) 如果你必须根据用户输入替换字符串,你可以试试下面的代码
read - "read the string that need to be modify" modifyString1 modifyString2 modifyString3
xmlstarlet ed -P -S -s "/mm2-moduleset/.../selectedCodeComponents" -t elem -n string -v $modifyString1 -s "/mm2-moduleset/.../selectedCodeComponents" -t elem -n string -v $modifyString2 -s "/mm2-moduleset/.../selectedCodeComponents" -t elem -n string -v $modifyString3 config.xml >temp.xml
mv temp.xml config.xml