Bash 4.2 hat Unterstützung für negative Teilstringlängen hinzugefügt:
http://tldp.org/LDP/abs/html/abs-guide.html#SUBSTREXTR01
Beispiel 37-12. Negativer Parameter im String-Extraktionskonstrukt
Wenn der Parameter "Länge" negativ ist, dient er als Versatz-vom-Ende-Parameter.
Die folgenden Ausgaben geben beispielsweise "World" aus, wenn sie unter Ubuntu getestet werden:
STR="Hello World!"
echo ${STR:6:-1}
In OS X (GNU Bash, Version 4.3.42 (1) - Release (x86_64-apple-darwin14.5.0)) führt diese Verwendung jedoch zu folgendem Fehler:
-1: substring expression < 0
Ist dieses 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?
bash
string-manipulation
Brent Faust
quelle
quelle
echo "Hello World" | rev | cut -c -5 | rev
Antworten:
Während die Lösung von flabdablet nur für Zeichenfolgen mit fester Länge funktioniert, können Sie diese als Drop-In-Ersatz für Zeichenfolgen mit dynamischer Größe verwenden:
Im Detail:
${#STR}
Gibt die Länge der Zeichenfolge zurück.$((a - b - c))
macht mathematische Subtraktion${STR:start:len}
gibt einen Teilstring zurück.Das zweite Argument für den Teilzeichenfolgenausdruck ist also die Länge der Zeichenfolge abzüglich des Startversatzes abzüglich des Werts, den Sie in der neueren Bash-Syntax als negativen Wert angeben würden.
quelle
$ {STR: 6: $ {# STR} -7} sollte ein funktionierender 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 sich OS X Bash über negative Längen beschwert oder bei Bash-Versionen, die negative Längen unterstützen, die als Offsets von rechts genommen werden, schrecklich schief geht.
quelle
Von hier aus gegoogelt :
Sie sagen,
${STR:6:$#-1}
sollte gut funktionierenIn meinem Fall begann es mit einem ähnlichen Fehler
${VERSION::-2}
einfach zu funktionieren, nachdem 0 wie folgt hinzugefügt wurde :${VERSION:0:-2}
.quelle