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?
bash
string-manipulation
Brent Faust
la source
la source
echo "Hello World" | rev | cut -c -5 | rev
Réponses:
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:
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.
la source
$ {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.
la source
Googlé d' ici :
Ils disent que ça
${STR:6:$#-1}
devrait bien marcherDans mon cas, avec une erreur semblable
${VERSION::-2}
, simplement commencé à travailler après avoir ajouté 0 comme ceci:${VERSION:0:-2}
.la source