说我的xml看起来像下面那个。期望是标头中第一次出现的计数应该具有一个值,该值等于记录中存在的所有计数元素的值的总和。计算完并在第一个计数标记中替换总和后,应删除记录中的所有计数标记及其值。行出现可能会有所不同,但标题只出现一次。
<root>
<!-- Header section, occurs only once per document-->
<header>
<count>0</count>
</header>
<!-- Records section, could occur more than once-->
<records>
<!-- Individual records with id and count-->
<Row>
<id>1</id>
<count>10</count>
</Row>
<Row>
<id>2</id>
<count>20</count>
</Row>
</records>
</root>
答案 0 :(得分:0)
以下是awk
,不确定是否可以使用sed
这会两次读取file
。第一次从records
开始计算柜台
然后第二次,更新标题中的计数器。
awk -F"<|>" 'FNR==NR {if (/<records>/) f=1; if (f && /<count>/) s+=$3;next} /<header>/ {g=1} g && /<count>/ {sub(/>[0-9]*</,">"s"<");g=0} /<Row>/ {c=1} !(/<count>/ && c)' file{,} <root>
<!-- Header section, occurs only once per document-->
<header>
<count>30</count>
</header>
<!-- Records section, could occur more than once-->
<records>
<!-- Individual records with id and count-->
<Row>
<id>1</id>
</Row>
<Row>
<id>2</id>
</Row>
</records>
</root>
file{,}
与file file
相同。为了避免您输入文件名两次。
更具可读性:
awk -F"<|>" '
FNR==NR {
if (/<records>/)
f=1
if (f && /<count>/)
s+=$3
next}
/<header>/ {g=1}
g && /<count>/ {
sub(/>[0-9]*</,">"s"<")
g=0}
/<Row>/ {c=1}
!(/<count>/ && c)
' file{,}