En realidad esta no es mi pregunta, alguien preguntó sobre esto en un grupo de Facebook pero nadie pudo responder, por lo que hay algunas variables:
x="abcde12345"
y="s'ldfsd[opsk12345"
z="1234sdfsdfafa23456"
Quiere mostrar los números al final de esas variables, por lo que el resultado final debería ser así:
12345
123456
El número de dígitos varía, puede ser de 1 a 10 o incluso de 1 a 100000. Y no siempre es así 12345
, es aleatorio. Cuál es la mejor manera de lograr esto ? Lo intenté grep -P "[0-9].*[0-9]$"
pero también muestra letras entre números.
Respuesta1
En bash, puede eliminar la subcadena inicial más larga que termina con un dígito que no es un dígito de una variable $var
usandosustitución de parámetros ${var##[^0-9]}
o (POSIXly), ${var##[!0-9]}
por ejemplo
$ echo "$x --> ${x##*[^0-9]}"
abcde12345 --> 12345
$
$ echo "$y --> ${y##*[^0-9]}"
s'ldfsd[opsk12345 --> 12345
$
$ echo "$z --> ${z##*[^0-9]}"
1234sdfsdfafa23456 --> 23456
ver por ejemploExpansión de parámetros
Respuesta2
#!/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]*$'
Producción:
12345
12345
23456
según 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.