Bash 4.2 hat Unterstützung für negative Teilzeichenfolgenlängen hinzugefügt:
http://tldp.org/LDP/abs/html/abs-guide.html#SUBSTREXTR01
Beispiel 37-12. Negativer Parameter in der String-Extraktionskonstruktion
Wenn der Parameter „Länge“ negativ ist, dient er als Offset-vom-Ende-Parameter.
Beispielsweise gibt das Folgende bei einem Test unter Ubuntu „World“ aus:
STR="Hello World!"
echo ${STR:6:-1}
Aber unter OS X (GNU Bash, Version 4.3.42(1)-Release (x86_64-apple-darwin14.5.0)) führt diese Verwendung zu folgendem Fehler:
-1: substring expression < 0
Ist das OS X-spezifisch oder wurde es in späteren Bash-Updates wieder deaktiviert? Gibt es eine Möglichkeit, diese Funktionalität für OS X zu aktivieren?
Antwort1
Während die Lösung von flabdablet nur für Zeichenfolgen mit fester Länge funktioniert, können Sie dies als Drop-In-Ersatz für Zeichenfolgen mit dynamischer Größe verwenden:
echo ${STR:6:$((${#STR} - 6 - 1))}
Im Detail:
${#STR}
gibt die Länge der Zeichenfolge zurück.$((a - b - c))
macht mathematische Subtraktion${STR:start:len}
gibt eine Teilzeichenfolge zurück.
Kombiniert ist das zweite Argument des Teilstring-Ausdrucks also die Länge des Strings abzüglich des Start-Offsets abzüglich des Werts, den Sie in der neueren Bash-Syntax als negativen Wert angeben würden.
Antwort2
${STR:6:${#STR}-7} sollte ein funktionierender Drop-In-Ersatz für ${STR:6:-1} sein, wenn STR garantiert mindestens 7 Zeichen enthält. Wenn es kürzer sein könnte, würde dies auch dazu führen, dass OS X Bash negative Längen bemängelt oder bei Bash-Versionen, die negative Längen als Offsets von rechts unterstützen, schreckliche Fehler auftreten.
Antwort3
Es ist möglich, am Ende dynamisch zu schneiden, indem die Länge als Eingabe für die Berechnung verwendet wird.
${STR:0:${#STR}-2}
Die -2 ist der negative Betrag.
Antwort4
Gegoogelt vonHier:
Sie sagen, ${STR:6:$#-1}
sollte gut funktionieren
In meinem Fall, mit einem ähnlichen Fehler ${VERSION::-2}
, hat es einfach funktioniert, nachdem ich 0 hinzugefügt habe, und zwar wie folgt: ${VERSION:0:-2}
.