【问题标题】:How can I count leading and trailing blanks in xml with awk?如何使用 awk 计算 xml 中的前导和尾随空格?
【发布时间】:2016-04-11 10:45:56
【问题描述】:

在 XML 值中计算前导和尾随空格的最佳方法是什么?特别是,如果我有这个 xml:

<?xml version="1.0" encoding="UTF-8"?>
<dvm name="Filename" xml="http://www.google.it">
  <description>AL</description>
  <columns>
    <column>abcde</column>
    <column>fg</column>
  </columns>
  <rows>
    <row>
      <cell id="1"> 08 4      </cell>
      <cell id="2">AG</cell>
    </row>
    <row>
      <cell id="1">    00 6        </cell>
      <cell id="2">   AL   </cell>
    </row>
    <row>
      <cell id="1">0 42 </cell>
      <cell id="2">AN  </cell>
    </row>
   </rows>
</dvm>

如何使用 awk 命令计算 ">" 和第一次出现的 char/digit 和/或最后一个 char/digit 和 XML 结束标记值之间的前导和尾随空格?我需要知道前导空格的总和和尾随空格的总和,并将它们放入两个变量中。提前致谢。

输出应该是:

领先:8

尾随:20

【问题讨论】:

    标签: xml awk count


    【解决方案1】:

    在我开始之前,让我说这种方法非常脆弱;如果您的 XML 格式与您向我们展示的方式不同,并且即使其中一个标签包含某些字符(例如换行符),它也会失败。使用 XML 时,awk 不是适合这项工作的工具。

    也就是说,您可以使用以下方式为您显示的输入获取所需的值:

    awk -F'[<>]' '$2 ~ /^cell/ { 
      if (match($3, /^ +/)) leading += RLENGTH
      if (match($3, / +$/)) trailing += RLENGTH 
    } END { print "leading: " leading+0, "trailing: " trailing+0 }' file
    

    将字段分隔符设置为&lt;&gt;,因此&lt;cell&gt; 标记的内容是该行的第三个字段。使用match 检查标签内容开始/结束处的空格。 RLENGTH 是一个特殊变量,设置为匹配字符串的长度。

    【讨论】:

    • 您好,感谢您的回复。使用您的代码,输出为:leading: trailing: 4
    • 也许他们是制表符?通过在每个模式中使用 [[:space:]] 而不是空格字符,将它们视为单个空格会很简单。
    • 是空格,不是制表符
    • 恐怕我无法用您在问题中显示的数据重现您的问题。我建议您尝试进行一些调试,例如print $3 以确保使用正确的字段。
    • 鉴于发布的示例输入,脚本是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    相关资源
    最近更新 更多