문자열에서 모든 숫자를 가져와서 추가하는 방법은 무엇입니까?

문자열에서 모든 숫자를 가져와서 추가하는 방법은 무엇입니까?

일부 소프트웨어에서 testSuite를 실행한 결과를 요약하려면 생성된 .xml 파일을 구문 분석해야 합니다. 예를 들어 내 줄 중 하나에서 :

<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여러 위치에 있는 노드가 발견 되면 각 노드에 대해 한 줄이 출력됩니다.

xmlstarlet일부 시스템 에서는 XMLStarlet이 xml.

관련 정보