Bash: 변수 내용에 나타나는 첫 번째 숫자를 얻는 방법

Bash: 변수 내용에 나타나는 첫 번째 숫자를 얻는 방법

변수의 첫 번째 수량을 얻는 방법

변수가 있습니다.

STR="My horse weighs 3000 kg but the car weighs more"
STR="Maruska found 000011 mushrooms but only 001 was not with meat"
STR="Yesterday I almost won the lottery 0000020 CZK but in the end it was only 05 CZK"

숫자를 알아내야 합니다.

3000
11
20

답변1

한 가지 방법은 다음과 같습니다.

echo $STR | grep -o -E '[0-9]+' | head -1 | sed -e 's/^0\+//'

시험:

$ STR="My horse weighs 3000 kg but the car weighs more"
$ echo $STR | grep -o -E '[0-9]+' | head -1 | sed -e 's/^0\+//'
3000

$ STR="Maruska found 000011 mushrooms but only 001 was not with meat"
$ echo $STR | grep -o -E '[0-9]+' | head -1 | sed -e 's/^0\+//'
11

$ STR="Yesterday I almost won the lottery 0000020 CZK but in the end it was only 05 CZK"
$ echo $STR | grep -o -E '[0-9]+' | head -1 | sed -e 's/^0\+//'
20

답변2

gawk를 사용하여 레코드 구분 기호를 RS일련의 숫자로 설정합니다. RS패턴과 일치하는 텍스트를 검색할 수 있습니다 RT. 숫자가 되도록 강제로 0추가하려면 앞에 오는 0을 제거합니다. RT첫 번째 인스턴스 인쇄 후 즉시 종료

awk -v RS=[0-9]+ '{print RT+0;exit}' <<< "$STR"

아니면 이것이 bash 솔루션입니까?

shopt -s extglob
read -r Z _ <<< "${STR//[^[:digit:] ]/}"
echo ${Z##+(0)}

답변3

구현이 grep그렇지 않거나 -oBash를 사용하지 않는 경우 다음을 수행할 수 있습니다.

printf "%.0f\n" $(printf "%s" "$string"|sed  's/^[^0-9]*//;s/[^0-9].*$//')

답변4

이 데모를 쉽게 반복할 수 있도록 문자열을 배열에 넣었습니다.

이는 Bash의 내장 정규식 일치를 사용합니다.

필요한 것은 매우 간단한 패턴뿐입니다. 패턴을 일치 테스트에 직접 통합하기보다는 변수를 사용하여 패턴을 유지하는 것이 좋습니다. 이는 보다 복잡한 패턴에 매우 중요합니다.

str[0]="My horse weighs 3000 kg but the car weighs more"
str[1]="Maruska found 000011 mushrooms but only 001 was not with meat"
str[2]="Yesterday I almost won the lottery 0000020 CZK but in the end it was only 05 CZK"

patt='([[:digit:]]+)'

for s in "${str[@]}"; do [[ $s =~ $patt ]] && echo "[${BASH_REMATCH[1]}] - $s"; done

숫자를 시각적으로 구분하기 위해 대괄호를 추가했습니다.

산출:

[3000] - My horse weighs 3000 kg but the car weighs more
[000011] - Maruska found 000011 mushrooms but only 001 was not with meat
[0000020] - Yesterday I almost won the lottery 0000020 CZK but in the end it was only 05 CZK

앞에 0이 없는 숫자를 얻는 가장 쉬운 방법은 10진수 변환을 강제하는 것입니다.

echo "$(( 10#${BASH_REMATCH[1]} ))"

이를 교체하면 요청한 것과 같은 출력이 표시됩니다.

3000
11
20

관련 정보