Bash 4.3 Negative Länge des Teilstrings unter OS X.

12

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?

Brent Faust
quelle
1
tldp.org/LDP/abs/html/abs-guide.html#BASH2 - was hinzugefügt wurde, wenn ab v2, v3 und v4 folgt.
Hannu
@ Hannu ja, dieses Dokument besagt, dass die negative Längensemantik in Version 4.2 hinzugefügt wurde
Brent Faust
Ich habe das gleiche Problem: Haben Sie einen Weg gefunden, damit umzugehen?
Romain Jouin
@romainjouin Nur durch Ändern des Algorithmus. Diese Syntax funktioniert unter OX X einfach nicht, selbst ab Bash Version 4.3.46! Stimmen Sie die Frage ab, um mehr Augen dafür zu bekommen. Jemand kennt die Antwort ...
Brent Faust
1
@ Rubistro Schlagen Sie einfach diese: | Ein Weg, um es echo "Hello World" | rev | cut -c -5 | rev
Donovanmüller

Antworten:

7

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:

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

Kayahr
quelle
2

$ {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.

flabdablet
quelle
Thx, hat den Trick für mich gemacht
Jean-Bernard Jansen
0

Von hier aus gegoogelt :

Sie sagen, ${STR:6:$#-1}sollte gut funktionieren

In meinem Fall begann es mit einem ähnlichen Fehler ${VERSION::-2}einfach zu funktionieren, nachdem 0 wie folgt hinzugefügt wurde : ${VERSION:0:-2}.

Aleksei Tselishchev
quelle