En mi shell script hay un parámetro que viene de ciertos sistemas y da una respuesta similar a esta: PAR0000008. Y necesito enviar solo el último número de este parámetro a otra variable, es decir, VAR=8. Usé el comando VAR=$( echo ${PAR} | cut -c 10 ) y funcionó perfectamente. El problema es cuando el parámetro PAR regresa con números de dos decimales como PAR0000012. Necesito descartar los ceros iniciales y enviar solo el número 12 a la variable, pero no sé cómo hacer la lógica en el Shell para descartar todos los caracteres a la izquierda del número.
Editar usando grep para manejar 0 como parte del número final
Dado que está utilizando el shell POSIX, tiene sentido utilizar una utilidad como sed o grep (o cut ). grep es un poco más flexible al analizar la cadena, lo que permite que una coincidencia REGEX maneje el trabajo. Di tu variable v=PAR0312012 y quieres el resultado r=312012 . Puede usar una sustitución de comando (por ejemplo $(...) ) para analizar el valor asignando el resultado a r , por ejemplo
v=PAR0312012 r=$(echo $v | grep -Eo '[1-9].*$') echo $r La expresión grep es:
-Eo : use REGEX extendido y solo devuelva la parte coincidente de la cadena,[1-9].*$ - desde el primer carácter en [1-9] devuelve el resto de la cadena. Esto funcionará para PAR0000012 o PAR0312012 (con resultado 312012 ).
Resultado
Para PAR0312012
312012 Otra solución usando expr
Si su variable puede tener ceros como parte de la parte final del número, entonces debe encontrar el índice donde aparece el primer carácter [1-9] y luego asignar la subcadena que comienza en ese índice a su variable de resultado.
El shell POSIX proporciona expr , que proporciona un conjunto de herramientas de análisis de cadenas que pueden hacer esto. Los comandos necesarios son:
expr index string charlisty
expr substr string start end Donde start y end son los índices de inicio y final para extraer de la cadena. end solo tiene que ser lo suficientemente largo para abarcar toda la subcadena, por lo que puede usar la longitud total de su cadena, por ejemplo
v=PAR0312012 ndx=$(expr index "$v" "123456789") r=$(expr substr "$v" "$ndx" 10) echo $rResultado
312012 Esto manejará 0 en cualquier lugar después del primero [1-9] .
( nota: la antigua expr ... no es la forma más rápida de manejar esto, pero si solo le preocupan unas pocas decenas de miles de valores, funcionará bien. Es probable que se necesiten mil millones de números y otro método)
Esto se puede hacer fácilmente usando Expensión de Parámetros .
var='PAR0000008' echo "${var##*0}" //prints 8 echo "${var##*[^1-9]}" //prints 8 var="${var##*0}" echo "$var" //prints 8 var='PAR0000012' echo "${var##*0}" //prints 12 echo "${var##*[^1-9]}" //prints 12 var="${var##*[^1-9]}" echo "$var" //prints 12