代码之家  ›  专栏  ›  技术社区  ›  robmax

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

  •  2
  • robmax  · 技术社区  · 7 年前

    我有如下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>
    

    我需要数一数后面的数字 tests 行中的单词如下: <testsuite name="demo / generate_access_token" id="60ec5" tests="2" time="0.583"> . 在这个例子中,我有两个这样的数字:2和1,所以我的输出应该是3。如何在Bash中执行此操作?grep有可能吗?

    4 回复  |  直到 7 年前
        1
  •  5
  •   RomanPerekhrest    7 年前

    不使用 grep , sed 和解析XML/HTML数据一样,它永远不会得到健壮和可伸缩的结果。
    使用适当的XML/HTML处理器,如 xmlstarlet :

    xmlstarlet sel -t -v 'sum(//testsuite[@tests]/@tests)' -n input.xml
    

    输出:

    3
    
        2
  •  1
  •   Socowi    7 年前

    如果您有GNU grep(通常预安装在linux上,但不安装在mac上),您可以使用

    grep -Po 'tests="\K\d*(?=")' inputFile
    

    否则,您可以使用

    grep -Eo 'tests="[0-9]*"' inputFile | grep -Eo '[0-9]*'
    

    这些命令将打印写入的所有数字 tests="..." . 要总结这些数字,您可以安装并使用 numsum :

    grep ... | numsum
    
        3
  •  0
  •   RavinderSingh13 Nikita Bakshi    7 年前

    下列的 awk 可能对你也有帮助。

    awk '/tests=/{gsub(/.*=|"/,"",$(NF-1));sum+=$(NF-1)} END{print sum}'  Input_file
    
        4
  •  0
  •   jiwopene    7 年前
    grep -o 'tests="[0-9]*"'|grep -o '[0-9]*'
    

    此命令从stdin读取文件,并将每行一个数字写入stdout。

    说明:

    • grep-查找实用程序
    • -o-仅写匹配,而不是行
    • 测试=“[0-9]*”-匹配测试=” 任意数字
    • 第二个grep-仅提取数字

    您可以将其与 bc 计算总和的计算器:

    grep -o 'tests="[0-9]*"'|grep -o '[0-9]*'|paste -sd+|bc
    

    如果不想使用 卑诗省 (有时未安装)并在纯bash中计算(使用 grep paste ),您可以使用 $(($(...))) 符号:

    echo $(($(grep -o 'tests="[0-9]*"'|grep -o '[0-9]*'|paste -sd+)))
    

    如果你也没有 粘贴 ,您可以使用 while 要替换它:

     echo $(($(grep -o 'tests="[0-9]*"'|grep -o '[0-9]*'|while read N; do echo -n "+$N"; done)))