当值的值与使用shell脚本的文本文件中的条目匹配时,将带有值的新标记添加到xml文件节点

时间:2017-03-10 06:46:24

标签: xml shell sed

我是shell脚本的新手。如果节点值在txt文件中,则目标是添加新的兄弟节点。

这是xml文件:animals.xml

   ERROR 2006 (HY000) at line 3838122: MySQL server has gone away

这是文本文件:feed.txt

<aaa>
   <bbb>123</bbb>
   <ccc>cat</ccc>
   <ddd>dog</ddd>
   </aaa>
<aaa>
   <bbb>456</bbb>
   <ccc>fox</ccc>
   <ddd>bat</ddd>
</aaa>
<aaa>
   <bbb>789</bbb>
   <ccc>rat</ccc>
   <ddd>pig</ddd>
</aaa>

要添加的标签是

123
789

鉴于上面的示例,animals.xml内容应更新为

<eee>feed<eee>

我试过以下但没有运气

<aaa>
   <bbb>123</bbb>
   <ccc>cat</ccc>
   <ddd>dog</ddd>
   <eee>feed</eee>
</aaa>
<aaa>
   <bbb>456</bbb>
   <ccc>fox</ccc>
   <ddd>bat</ddd>
</aaa>
<aaa>
   <bbb>789</bbb>
   <ccc>rat</ccc>
   <ddd>pig</ddd>
   <eee>feed</eee>
</aaa>

sed行不起作用。仅当$ f替换为实际值时才有效。但我不能这样做。

feed_content="<eee>feed</eee>"
feed_tag=$(echo $feed_content | sed 's/\//\\\//g')
while IFS= read -r f
do
   #Check if there is a <bbb> tag with value equals to f. If there is,append the <eee>feed</eee>
   sed "/<bbb>$f<\/bbb>/ s/.*/${feed_tag}\n&/" $f
done < feed.txt

解决:

事实证明$ f包含许多尾随空格。我只需要修剪它并且sed语句有效。

sed "/<bbb>123<\/bbb>/ s/.*/${feed_tag}\n&/" $f

2 个答案:

答案 0 :(得分:0)

我建议使用xmlstarlet,如下所示:

xmlstarlet ed -s '//bbb[text()='123' or text()='789']/..' \
    -t elem -n eee -u './/eee' -v feed animals.xml

如有必要,您可以使用sedfeed.txt生成xpath表达式。

答案 1 :(得分:0)

str="<eee>feed</eee>"
while read id; do
sed -ri '/<aaa>/{:a;N;/<\/aaa>/!ba;/<bbb>'"$id"'/s#(.*\n)(\s+)([^\n]+\n)#&\2'"$str"'\n#}' animals.xml
done < feed.txt