在shell脚本

时间:2016-06-08 11:44:24

标签: xml shell sed

我想使用shell变量搜索和添加新的xml标签。

使用以下命令,KVM_IF_LIST_FILE将存储KVM实例的所有接口名称[它将包含ex:eno1 eno2 eno3 eno4]。

virsh domiflist $kvm_name|awk {'print $3'}|awk 'NR>2' >> $KVM_IF_LIST_FILE

现在我需要搜索<source dev='eno0/1/2/3' mode='bridge'/>,如果找到上面的模式,需要添加新的xml节点 (<target dev=\'$kvm_name$cnt\'/>)旁边的上述模式。我已经编写了下面的shell脚本,在这种情况下它不起作用。

cnt=0
for i in `cat $KVM_IF_LIST_FILE`
do
echo "Updating macvtap device names for $i"
sed -i.bak "/source dev='\'/a <target dev=\'$kvm_name$cnt\'/>" $XML_FILE
cnt=`expr $cnt + 1`
done

请告诉我如何修改上述脚本以执行上述搜索和替换。

2 个答案:

答案 0 :(得分:2)

鉴于以下文件:

<root>
  <prior/>
  <source dev='foo'/>
  <successor/>
</root>

...我们可以在匹配的<target>元素之后附加一个新的source元素,如下所示:

kvm_name=hello
cnt=5
xmlstarlet ed \
  --var kvm "'$kvm_name$cnt'" \
  -a '//source' -t elem -n target -v "$kvm_name$cnt" \
  -i '//target' -t attr -n dev -v "$kvm_name$cnt" \
  -d '//target[.=$kvm]/text()' <foo.xml 

...产生以下输出:

<?xml version="1.0"?>
<root>
  <prior/>
  <source dev="foo"/>
  <target dev="hello5"/>
  <successor/>
</root>

答案 1 :(得分:0)

您可能还没有意识到,但很快就会发现,使用解析XML以及HTML最终会导致麻烦。例如可以在自身内部重复使用相同的标签;它不能用regexp解析。

首先了解一些XSL(好tutorials)来正确转换XML。一个好的开源工具例如是xsltproc