Bash 4.3 Teilzeichenfolgen mit negativer Länge unter OS X

Bash 4.3 Teilzeichenfolgen mit negativer Länge unter OS X

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}.

verwandte Informationen