【问题标题】:using 'sed' to replace the value in the 1st occurrence of an open/close XML tag with a value that is sum of values from the similar remaining tags使用“sed”将第一次出现的打开/关闭 XML 标记中的值替换为类似剩余标记中的值的总和
【发布时间】:2014-09-01 16:46:42
【问题描述】:

假设我的 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>

【问题讨论】:

  • 您既不想使用一般的正则表达式,也不想特别使用 sed。使用合适的工具,一个真正支持 XML 的工具。话虽如此,这个网站并不是编程任务的垃圾场。做你自己的工作,当你有工作要展示时寻求帮助。

标签: xml regex sed


【解决方案1】:

这是一个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{,}

【讨论】:

  • 他想删除除标题之外的计数标签
  • @Jidder 更新帖子。为什么他自己不评论这个???不看我们发的帖子?
  • 我的系统崩溃并且我的帐户被锁定。我只是让我的系统恢复正常。
  • 在发布我的生产问题之前尝试过 xslt,但由于文件大小为 1.5 GB,我们遇到了内存问题。所以我们使用 jaxb 来获取输出,然后探索是否可以使用 sed 或 awk 来获取计数总和。尝试了以下方法并给出了计数,但不确定是否要替换我们不需要的标签 sed -n "/\/,/\/records>/p" test.xml | grep 计数 | sed -e "s/]*>//g" -e "s/ //g" | awk '{ 总和+=$1; } END { 打印总和 }'
  • 谢谢乔特尼。您的解决方案给了我足够的指示。感谢您的所有帮助。
猜你喜欢
  • 2013-04-13
  • 2016-04-02
  • 2018-03-10
  • 1970-01-01
  • 2019-01-09
  • 2023-03-28
  • 2015-01-01
  • 2013-11-19
  • 1970-01-01
相关资源
最近更新 更多