Bash에서 선행 문자열 제거

Bash에서 선행 문자열 제거

이와 같은 문자열이 있는데 rev00000010마지막 숫자만 원합니다. 이 경우에는 10입니다.

나는 이것을 시도했습니다 :

TEST='rev00000010'
echo "$TEST" | sed '/^[[:alpha:]][0]*/d'
echo "$TEST" | sed '/^rev[0]*/d'

정규식은 올바른 것 같지만 둘 다 아무것도 반환하지 않습니다.정규식)

답변1

전달하는 명령의 의미는 sed다음과 같습니다.행이 정규식과 일치하면 삭제하십시오.. 그것은 당신이 원하는 것이 아닙니다.

echo "$TEST" | sed 's/rev0*//'

이는 다음을 의미합니다.각 줄에서 rev를 제거하고 그 뒤에 0을 몇 개나 붙입니다.

sed그리고 그렇게 간단한 것은 필요하지 않습니다 . 그냥 bash를 사용하세요.매개변수 확장:

shopt -s extglob         # Turn on extended globbing.
echo "${TEST##rev*(0)}"  # Remove everything from the beginning up to `rev`
                         # followed by the maximal number of zeroes.

답변2

POSIX적으로:

test='rev00000010'
number=${test#"${test%%[1-9]*}"}

가장 왼쪽의 0이 아닌 숫자 왼쪽에 있는 모든 내용이 삭제됩니다.

번리/유니버설:

number=`expr "x$test" : 'xrev0*\(.*\)'`

답변3

TEST 변수가 이미 있는 경우 이를 인쇄하고 모든 문자를 제거하세요.

printf "%.0f\n" ${TEST//[a-z]/}

또는

printf "%g\n" ${TEST//[a-z]/}

선행이 있는 숫자는 다음과 같이 해석되므로 %dor echo- 명령을 사용하지 마십시오.0octal

답변4

"마지막 숫자"를 얻으려면 문자열 끝에 있는 일련의 숫자를 선택하고 이를 10진수로 변환합니다.

강타 사용:

 [[ "$test" =~  ([1-9][0-9]*)$ ]] && echo "number: $((10#${BASH_REMATCH[1]}))"

grep을 사용하세요:

echo "$test" | grep -Po "[1-9][0-9]*$"

관련 정보