我有这样的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可以吗?
答案 0 :(得分:5)
不要使用grep
,sed
等来解析XML / HTML数据 - 它永远不会产生强大且可扩展的结果。
使用正确的XML / HTML处理器,例如 xmlstarlet
:
xmlstarlet sel -t -v 'sum(//testsuite[@tests]/@tests)' -n input.xml
输出:
3
答案 1 :(得分:1)
如果您有GNU grep(通常预安装在Linux但不是mac),您可以使用
awk '/tests=/{gsub(/.*=|"/,"",$(NF-1));sum+=$(NF-1)} END{print sum}' Input_file
否则你可以使用
grep -Po 'tests="\K\d*(?=")' inputFile
这些命令将打印用grep -Eo 'tests="[0-9]*"' inputFile | grep -Eo '[0-9]*'
写的所有数字。要总结这些数字,您可以安装并使用tests="..."
:
numsum
答案 2 :(得分:0)
关注classes_1
可能对您有帮助。
awk
答案 3 :(得分:0)
Sub CreateHyperlinks( _
raHypers() As Range, _
saSubaddresses() As String, _
saScreentips() As String)
Dim myRange As Range
For Each myRange In raHypers
' your code
Next myRange
End Sub
此命令从stdin读取文件,每行写一个数字到stdout。
说明
您可以将其与grep -o 'tests="[0-9]*"'|grep -o '[0-9]*'
计算器结合使用以计算总和:
bc
如果您不想使用grep -o 'tests="[0-9]*"'|grep -o '[0-9]*'|paste -sd+|bc
(有时不安装)并使用纯粹的bash计算(使用bc
和grep
),您可以使用{{1符号:
paste
如果您还没有$(($(...)))
,则可以使用echo $(($(grep -o 'tests="[0-9]*"'|grep -o '[0-9]*'|paste -sd+)))
替换它:
paste