이것은 실제로 제 질문이 아닙니다. 누군가가 페이스북 그룹에서 이 질문을 했지만 아무도 대답할 수 없었기 때문에 몇 가지 변수가 있습니다.
x="abcde12345"
y="s'ldfsd[opsk12345"
z="1234sdfsdfafa23456"
그는 이 변수의 끝에 숫자를 표시하려고 하므로 최종 결과는 다음과 같아야 합니다.
12345
123456
자릿수는 1에서 10까지, 심지어 1에서 100,000까지 다양합니다. 그리고 항상 이런 것은 아니고 12345
무작위입니다. 이를 달성하는 가장 좋은 방법은 무엇입니까? 나는 이것을 시도했지만 grep -P "[0-9].*[0-9]$"
숫자 사이에 문자도 표시합니다.
답변1
$var
Bash에서는 다음을 사용하여 변수에서 숫자가 아닌 값으로 끝나는 가장 긴 선행 하위 문자열을 제거할 수 있습니다.매개변수 대체 ${var##[^0-9]}
또는 (POSIXly) ${var##[!0-9]}
예를 들어
$ echo "$x --> ${x##*[^0-9]}"
abcde12345 --> 12345
$
$ echo "$y --> ${y##*[^0-9]}"
s'ldfsd[opsk12345 --> 12345
$
$ echo "$z --> ${z##*[^0-9]}"
1234sdfsdfafa23456 --> 23456
예시 보기매개변수 확장
답변2
#!/bin/bash
x="abcde12345"
y="s'ldfsd[opsk12345"
z="1234sdfsdfafa23456"
echo $x | grep -o '[0-9]*$'
echo $y | grep -o '[0-9]*$'
echo $z | grep -o '[0-9]*$'
산출:
12345
12345
23456
man grep에 따르면
-o, --only-matching Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.