我在.xml文件中有这么多格式的实例:
<FFFFF>
<BBBBB>
"good B data"
</BBBBB>
<BBBBB>
"more good B data"
</BBBBB>
</FFFFF>
<AAAAA>
<BBBBB>
"some data"
</BBBBB>
<BBBBB>
"more B data"
</BBBBB>
</AAAAA>
我正在尝试删除A标记,并重命名A标记中的B标记;所以最终的结果是:(请注意,将B标签重命名为任何标签也没关系,它们就不能再为B了)
<FFFFF>
<BBBBB>
"good B data"
</BBBBB>
<BBBBB>
"more good B data"
</BBBBB>
</FFFFF>
<AAAAA>
"some data"
</AAAAA>
<AAAAA>
"more B data"
</AAAAA>
我一直在搞乱sed,但我无法弄清楚如何做到这一点。每个A中没有固定数量的B标签(有些没有,有些可能有20个,等等)。另一个问题是我不想删除其他地方存在的B标签;所以我不能在B标签上进行简单的查找和替换,因为这会改变嵌入的标签。
感谢任何帮助,谢谢!
答案 0 :(得分:1)
$ cat file
<FFFFF>
<BBBBB>
"good B data"
</BBBBB>
<BBBBB>
"more good B data"
</BBBBB>
</FFFFF>
<AAAAA>
<BBBBB>
"some data"
</BBBBB>
<BBBBB>
"more B data"
</BBBBB>
</AAAAA>
$ cat tst.awk
BEGIN{ remove="AAAAA"; changeFrom="BBBBB"; changeTo="XXXXX" }
$1 ~ "^<" remove ">$" {
inRemove = 1
next
}
inRemove {
if ($1 ~ "^</" remove ">$") {
inRemove = 0
next
}
else if ($1 ~ "^</?" changeFrom ">$") {
sub(changeFrom,changeTo)
}
sub(/^ /,"")
}
{ print }
$ awk -f tst.awk file
<FFFFF>
<BBBBB>
"good B data"
</BBBBB>
<BBBBB>
"more good B data"
</BBBBB>
</FFFFF>
<XXXXX>
"some data"
</XXXXX>
<XXXXX>
"more B data"
</XXXXX>
答案 1 :(得分:0)
sed '/^<AAAAA>/,/^<\/AAAAA>/ {
/^<\/*AAAAA>/ s/^<\/*AAAAA>//
/^<\/*AAAAA>/ !{
s/^\([[:space:]]*\)<\(\/*\)BBBBB>/\1<\2AAAAA>/
}
}' YourFile