繁体   English   中英

在Shell脚本中使用sed添加新的xml标签

[英]Adding new xml tag using sed in shell script

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

使用以下命令, KVM_IF_LIST_FILE将存储KVM实例的所有接口名称[它将包含在例如: 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

请让我知道如何修改以上脚本以进行上述搜索和替换。

给定以下文件:

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

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

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>

您可能还不知道,但是很快就会发现,使用解析XML和HTML最终会带来麻烦。 例如,可以在自己内部重复相同的标签; 它不能用正则表达式解析。

首先学习一些XSL (很好的教程 )来正确地转换XML。 一个很好的开源工具是例如xsltproc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM