Bash

如何從字元串中取出所有數字並將它們相加?

  • March 30, 2018

我必須解析生成的 .xml 文件以總結在某些軟體上執行 testSuite 的結果。例如,在一行中:

<Summary failed="10" notExecuted="0" timeout="0" pass="18065" />

這表示測試失敗、未執行和通過的次數。我需要弄清楚測試套件中有多少測試,所以我需要在上面的例子中添加 10+0+18065 = 18075。

我怎樣才能在 Bash 中做到這一點?

您可以xmlstarlet用於正確的 xml 解析。

對於您的問題:

total=0; \
for i in failed notExecuted pass; do \
   sum=`xmlstarlet sel -t -v "//Summary/@$i" test.xml`; \
   total=$(($sum + $total)); \
done; \
echo "Total=$total"

test.xml包含 xml 數據的文件在哪裡。

使用perl

perl -lne 'my @a=$_=~/(\d+)/g;$sum+=$_ for @a; print $sum' file

使用awk

tr ' ' '\n' < file | 
   awk '/[0-9]+/ {gsub(/[^0-9]/, "", $0); sum+=$0} END {print sum}'

例子

% perl -lne 'my @a=$_=~/(\d+)/g;$sum+=$_ for @a; print $sum' foo
18075

% tr ' ' '\n' < foo | 
   awk '/[0-9]+/ {gsub(/[^0-9]/, "", $0); sum+=$0} END {print sum}' 
18075

% cat foo
<Summary failed="10" notExecuted="0" timeout="0" pass="18065" />

引用自:https://unix.stackexchange.com/questions/215135