文字列からすべての数字を取得して追加するには?

文字列からすべての数字を取得して追加するには?

一部のソフトウェアでtestSuiteを実行した結果を要約するには、生成された.xmlファイルを解析する必要があります。たとえば、私の行の1つから:

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

これは、失敗したテスト、実行されていないテスト、通過したテストの数を示します。テストスイートにいくつのテストがあるかを計算する必要があるため、上記の場合は10 + 0 + 18065 = 18075を追加する必要があります。

Bashでこれを行うにはどうすればよいですか?

答え1

あなたはそれを使用することができます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.xmlxmlデータを含むファイルはどこにありますか?

答え2

使用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" />

答え3

数字や空白以外の文字をすべて削除してください。

echo '<Summary failed="10" notExecuted="0" timeout="0" pass="18065" />'|\
sed -e 's/[^0-9 ]//g'

与えられた

10 0 0 18065

合計は、DCを使用して実行できます(要求に応じてタイムアウトフィールドのフィルタリング)。

echo '<Summary failed="10" notExecuted="0" timeout="0" pass="18065" />'|\
sed -e 's/timeout="[0-9]*" //' \
    -e 's/[^0-9 ]//g' \
    -e 's/^ *//' \
    -e 's/ *$//' \
    -e 's/ /+/g' \
    -e 's/^/0 /' \
    -e 's/$/pq/'|dc

説明する

sedスクリプトは次のとおりです。

s/timeout="[0-9]*" //    #remove the timeout
s/[^0-9 ]//g             #drop anything but numbers and spaces
s/^ *//                  #drop spaces at the beginning of the line
s/ *$//                  #drop spaces at the end of the line
s/ /+/g                  #replace remaining spaces with +
s/^/0 /                  #add a 0 to initialize the sum for dc
s/$/pq/                  #add print and quit command for dc

スクリプトは次のように簡単に使用できます。

INPUT|sed -f script.sed

。複数行を入力するためにsedとdcを使用してこのスクリプトを適用することはあなたの役割です。私が書く必要があるのは一行だけです!

答え4

次の XML パーサーを使用します。XMLスター質問に提供されたファイル:

$ xml sel -t -m '//Summary' -v '@failed+@notExecuted+@timeout+@pass' -nl file.xml
18075

Summary複数の場所にあるノードが見つかると、各ノードに対して1行が出力されます。

xmlstarlet一部のシステムでは、XMLStarletがxml

関連情報