![Bash에서 선행 문자열 제거](https://linux55.com/image/59457/Bash%EC%97%90%EC%84%9C%20%EC%84%A0%ED%96%89%20%EB%AC%B8%EC%9E%90%EC%97%B4%20%EC%A0%9C%EA%B1%B0.png)
이와 같은 문자열이 있는데 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]/}
선행이 있는 숫자는 다음과 같이 해석되므로 %d
or echo
- 명령을 사용하지 마십시오.0
octal
답변4
"마지막 숫자"를 얻으려면 문자열 끝에 있는 일련의 숫자를 선택하고 이를 10진수로 변환합니다.
강타 사용:
[[ "$test" =~ ([1-9][0-9]*)$ ]] && echo "number: $((10#${BASH_REMATCH[1]}))"
grep을 사용하세요:
echo "$test" | grep -Po "[1-9][0-9]*$"