Na verdade essa não é minha pergunta, alguém perguntou sobre isso em um grupo do Facebook mas ninguém conseguiu responder, então existem algumas variáveis:
x="abcde12345"
y="s'ldfsd[opsk12345"
z="1234sdfsdfafa23456"
Ele quer mostrar os números no final dessas variáveis, então o resultado final deve ser assim:
12345
123456
O número de dígitos varia, pode ser de 1 a 10 ou até de 1 a 100.000. e nem sempre 12345
é aleatório. Qual é o melhor jeito de concluir isso ? Eu tentei grep -P "[0-9].*[0-9]$"
, mas também mostra letras entre números.
Responder1
No bash, você pode remover a substring inicial mais longa terminando com um não dígito de uma variável $var
usandosubstituição de parâmetro ${var##[^0-9]}
ou (POSIXly), ${var##[!0-9]}
por exemplo
$ echo "$x --> ${x##*[^0-9]}"
abcde12345 --> 12345
$
$ echo "$y --> ${y##*[^0-9]}"
s'ldfsd[opsk12345 --> 12345
$
$ echo "$z --> ${z##*[^0-9]}"
1234sdfsdfafa23456 --> 23456
Veja por exemploExpansão de parâmetros
Responder2
#!/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]*$'
Saída:
12345
12345
23456
conforme 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.