我是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
答案 0 :(得分:0)
我建议使用xmlstarlet
,如下所示:
xmlstarlet ed -s '//bbb[text()='123' or text()='789']/..' \
-t elem -n eee -u './/eee' -v feed animals.xml
如有必要,您可以使用sed
从feed.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