如何计算bash中单词之后的所有数字

rob*_*max 2 bash awk grep sed

我有像这样的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<testsuites name="social_service_demo" time="0.583">
  <testsuite name="demo / generate_access_token" id="60ec54b9-d67b-4f51-a20d-9794c3a85269" tests="2" time="0.583">
    <error>
    </error>
    <testcase name="Token should be generated correctly, response is 200" time="0.583">
      <failure type="AssertionFailure">
        <![CDATA[Failed 1 times.]]>
      </failure>
    </testcase>
    <testcase name="Returned JSON should contain access_token field" time="0.583">
      <failure type="AssertionFailure">
        <![CDATA[Failed 1 times.]]>
      </failure>
    </testcase>
  </testsuite>
  <testsuite name="demo / get_most_commented_entities" id="12aa656d-a702-4fc6-878c-2e0fde08021e" tests="1" time="0">
    <error>
    </error>
    <testcase name="Response is 200" time="0">
      <failure type="AssertionFailure">
        <![CDATA[Failed 1 times.]]>
      </failure>
    </testcase>
  </testsuite>
</testsuites>
Run Code Online (Sandbox Code Playgroud)

我需要计算出tests符合这条线的数字: <testsuite name="demo / generate_access_token" id="60ec5" tests="2" time="0.583">.在这个例子中,我有两个这样的数字:2和1,所以我的输出应该是3.如何在Bash中执行此操作?用grep可以吗?

Rom*_*est 5

不要使用grep,sed等同于解析XML/HTML数据 - 它永远不会产生强大和可扩展的结果.
使用适当的XML/HTML处理器,例如xmlstarlet:

xmlstarlet sel -t -v 'sum(//testsuite[@tests]/@tests)' -n input.xml
Run Code Online (Sandbox Code Playgroud)

输出:

3
Run Code Online (Sandbox Code Playgroud)