Longitud negativa de la subcadena Bash 4.3 en OS X

Longitud negativa de la subcadena Bash 4.3 en OS X

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}.

información relacionada