bash脚本中的Xmlstarlet sel命令 - 删除标记

时间:2017-03-20 15:12:35

标签: xml bash xmlstarlet

相关的xml文件:

<properties>
    <structure name="preference">
        <structure name="cam1">
            <property name="number" value="8"/>
            <property name="name" value="eddi"/>
        </structure>
        <structure name="cam2">
            <property name="number" value="2"/>
            <property name="name" value="franck"/>
        </structure>
    </structure>
</properties>

在我的bash脚本中,我想插入值&#34; 8&#34;在变量中然后在条件(if)中使用它。如果该值等于&#34; 8&#34;我必须删除结构&#34; cam1&#34;。

所以,我试图在这个命令中使用xmlstarlet工具:

xmlstarlet sel -T -t -m '/properties/structure[@name="preference"]/structure[@name="cam1"]/property[@name="number"]/@value' -v . -n file.xml

这是在终端中用来获取值的命令,在我用这种方式编写的脚本中:

camera=`xmlstarlet sel -T -t -m \'/properties/structure[@name=\"preference\"]/structure[@name=\"cam1\"]/property[@name=\"number\"]/@value\' -v . -n $1`
然后尝试打印变量:

echo $camera

当然我没有结果&#34; 8&#34;打印,我觉得我的背闪有问题...... 有没有其他方法可以轻松删除结构?

1 个答案:

答案 0 :(得分:0)

我不是100%肯定你是如何确定“8”的来源。为什么要在delete中提取要用作比较的值?

以下是一个示例,当structure属性值为property的子name元素具有number属性时,该元素将删除value元素值为8

希望这有帮助。

#!/usr/bin/env bash

toDelete="8"
modXML=$(xmlstarlet ed -d "/properties/structure[@name='preference']/structure[property[@name='number']/@value=$toDelete]" $1)

echo $modXML