Bash 4.2 agregó soporte para longitudes de subcadenas negativas:
http://tldp.org/LDP/abs/html/abs-guide.html#SUBSTREXTR01
Ejemplo 37-12. Parámetro negativo en construcción de extracción de cadenas
Cuando el parámetro "longitud" es negativo, sirve como parámetro de desplazamiento desde el final.
Por ejemplo, lo siguiente genera "Mundo" cuando se prueba en Ubuntu:
STR="Hello World!"
echo ${STR:6:-1}
Pero en OS X (GNU bash, versión 4.3.42(1)-release (x86_64-apple-darwin14.5.0)), ese uso produce el siguiente error:
-1: substring expression < 0
¿Es este OS X específico o se deshabilitó nuevamente en actualizaciones posteriores de bash? ¿Hay alguna manera de habilitar esta funcionalidad para OS X?
Respuesta1
Si bien la solución de flabdablet solo funciona para cadenas de longitud fija, puedes usarla como reemplazo directo para cadenas de tamaño dinámico:
echo ${STR:6:$((${#STR} - 6 - 1))}
En detalle:
${#STR}
devuelve la longitud de la cadena.$((a - b - c))
hace resta matemática${STR:start:len}
devuelve una subcadena.
Entonces, combinado, el segundo argumento de la expresión de subcadena es la longitud de la cadena menos el desplazamiento inicial menos el valor que especificaría como valor negativo en la sintaxis bash más nueva.
Respuesta2
${STR:6:${#STR}-7} debería ser un reemplazo directo funcional para ${STR:6:-1} si se garantiza que STR contiene al menos 7 caracteres. Si pudiera ser más corto, esto también hará que OS X bash se queje de longitudes negativas, o que salga terriblemente mal en las versiones de bash que admiten que las longitudes negativas se tomen como compensaciones desde la derecha.
Respuesta3
Es posible cortar al final dinámicamente utilizando la longitud como entrada para calcular.
${STR:0:${#STR}-2}
El -2 es la cantidad negativa.
Respuesta4
Buscado en Google desdeaquí:
Dicen que ${STR:6:$#-1}
debería funcionar bien.
En mi caso, con un error similar ${VERSION::-2}
, simplemente comenzó a funcionar después de agregar 0 así: ${VERSION:0:-2}
.