使用' sed'替换第一次出现的打开/关闭XML标记中的值,其值是来自相似剩余标记的值的总和

时间:2014-07-11 06:23:24

标签: xml regex sed

说我的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>

1 个答案:

答案 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{,}