Bash 4.3 Longitud negativa de la subcadena en OS X

12

Bash 4.2 agregó soporte para longitudes de subcadena negativas:

http://tldp.org/LDP/abs/html/abs-guide.html#SUBSTREXTR01

Ejemplo 37-12. Parámetro negativo en la construcción de extracción de cadenas

Cuando el parámetro "longitud" es negativo, sirve como un parámetro de compensación desde el final.

Por ejemplo, los siguientes resultados "Mundo" cuando se prueban 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 fue deshabilitado nuevamente en actualizaciones posteriores de bash? ¿Hay alguna manera de habilitar esta funcionalidad para OS X?

Brent Fausto
fuente
1
tldp.org/LDP/abs/html/abs-guide.html#BASH2 : lo que se agregó cuando, comenzando con v2, v3 y v4 sigue.
Hannu
@ Hannu sí, ese documento dice que la semántica de longitud negativa se agregó en la versión 4.2
Brent Faust
Tengo el mismo problema: ¿encontraste una manera de lidiar con eso?
Romain Jouin
@romainjouin Simplemente cambiando el algoritmo. ¡Esta sintaxis simplemente no funciona bajo OX X, incluso a partir de la versión 4.3.46 de Bash! Vuelva a votar la pregunta para tratar de obtener más ojos sobre esto. Alguien sabe la respuesta ...
Brent Faust
1
@Rubistro Solo presiona esto: | Una forma de echo "Hello World" | rev | cut -c -5 | rev
evitarlo

Respuestas:

7

Si bien la solución de flabdablet solo funciona para cadenas de longitud fija, puede usar esto como un 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, el segundo argumento combinado para 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 de bash más reciente.

kayahr
fuente
2

$ {STR: 6: $ {# STR} -7} debería ser un reemplazo directo 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 longitudes negativas tomadas como compensaciones de la derecha.

Flabdablet
fuente
Gracias, hizo el truco para mí
Jean-Bernard Jansen
0

Googleó desde aquí :

Dicen que ${STR:6:$#-1}debería funcionar bien

En mi caso, con un error similar ${VERSION::-2}, simplemente comenzó a trabajar después de la adición de 0 como esto: ${VERSION:0:-2}.

Aleksei Tselishchev
fuente