Bash 4.3 Longueur de sous-chaîne négative sur OS X

12

Bash 4.2 a ajouté la prise en charge des longueurs de sous-chaînes négatives:

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

Exemple 37-12. Paramètre négatif dans la construction d'extraction de chaîne

Lorsque le paramètre "longueur" est négatif, il sert de paramètre de décalage par rapport à la fin.

Par exemple, les sorties suivantes "World" lors d'un test sur Ubuntu:

STR="Hello World!"
echo ${STR:6:-1}

Mais sous OS X (GNU bash, version 4.3.42 (1) -release (x86_64-apple-darwin14.5.0)), cette utilisation produit l'erreur suivante:

-1: substring expression < 0

Cet OS X est-il spécifique ou a-t-il été désactivé à nouveau dans les mises à jour bash ultérieures? Existe-t-il un moyen d'activer cette fonctionnalité pour OS X?

Brent Faust
la source
1
tldp.org/LDP/abs/html/abs-guide.html#BASH2 - ce qui a été ajouté lorsque, en commençant par v2, v3 et v4 suit.
Hannu
@Hannu oui, ce document dit que la sémantique de longueur négative a été ajoutée dans la version 4.2
Brent Faust
J'ai le même problème: avez-vous trouvé un moyen de résoudre ce problème?
Romain Jouin
@romainjouin Juste en changeant l'algorithme. Cette syntaxe ne fonctionne tout simplement pas sous OX X, même à partir de la version 4.3.46 de Bash! Votez la question pour essayer d'avoir plus de regards sur cela. Quelqu'un connaît la réponse ...
Brent Faust
1
@Rubistro Juste frappé ceci: | Une façon de le contourner est (dans votre exemple)echo "Hello World" | rev | cut -c -5 | rev
donovanmuller

Réponses:

7

Bien que la solution de flabdablet ne fonctionne que pour les chaînes de longueur fixe, vous pouvez l'utiliser comme remplacement direct pour les chaînes de taille dynamique:

echo ${STR:6:$((${#STR} - 6 - 1))}

En détail:

  • ${#STR} renvoie la longueur de la chaîne.
  • $((a - b - c)) fait une soustraction mathématique
  • ${STR:start:len} renvoie une sous-chaîne.

Ainsi, le deuxième argument de l'expression de sous-chaîne est la longueur de la chaîne moins le décalage de départ moins la valeur que vous spécifieriez comme valeur négative dans la nouvelle syntaxe bash.

kayahr
la source
2

$ {STR: 6: $ {# STR} -7} devrait remplacer directement $ {STR: 6: -1} si STR contient au moins 7 caractères. Si elle peut être plus courte, cela entraînera également OSH bash à se plaindre des longueurs négatives, ou se tromper horriblement sur les versions bash qui prennent en charge les longueurs négatives prises comme des décalages à partir de la droite.

flabdablet
la source
Thx, a fait l'affaire pour moi
Jean-Bernard Jansen
0

Googlé d' ici :

Ils disent que ça ${STR:6:$#-1}devrait bien marcher

Dans mon cas, avec une erreur semblable ${VERSION::-2}, simplement commencé à travailler après avoir ajouté 0 comme ceci: ${VERSION:0:-2}.

Aleksei Tselishchev
la source