Bash 4.3 Negative Länge der Unterzeichenfolge unter OS X

1586
Brent Faust

Bash 4.2 fügte Unterstützung für negative Teilkettenlängen hinzu:

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 Offset-von-End-Parameter.

Zum Beispiel die folgenden Ausgaben "World", wenn sie unter Ubuntu getestet werden:

STR="Hello World!" echo $ 

In OS X (GNU bash, Version 4.3.42 (1) -release (x86_64-apple-darwin14.5.0)) verursacht diese Verwendung jedoch den folgenden Fehler:

-1: substring expression < 0 

Ist dieses OS X-spezifisch oder wurde es in späteren Bash-Aktualisierungen wieder deaktiviert? Gibt es eine Möglichkeit, diese Funktionalität für OS X zu aktivieren?

9
http://tldp.org/LDP/abs/html/abs-guide.html#BASH2 - was hinzugefügt wurde, wenn beginnend mit v2, v3 und v4. Hannu vor 8 Jahren 1
@Hannu ja, das Dokument sagt, dass die Negativlängensemantik in Version 4.2 hinzugefügt wurde Brent Faust vor 8 Jahren 0
Ich habe das gleiche Problem: Haben Sie einen Weg gefunden, damit umzugehen? Romain Jouin vor 7 Jahren 0
@romainjouin Nur durch Ändern des Algorithmus. Diese Syntax funktioniert nicht unter OX X, auch nicht in der Bash-Version 4.3.46! Stimmen Sie die Frage ab, um zu versuchen, mehr Augen auf diese Frage zu werfen. Jemand kennt die Antwort ... Brent Faust vor 7 Jahren 0
@Rubistro Genau das hier: | Ein Weg dahinter ist (in Ihrem Beispiel) `echo" Hello World "| rev | Schnitt -c -5 | rev` donovanmuller vor 7 Jahren 1

2 Antworten auf die Frage

2
flabdablet

$ -7} sollte ein funktionierender Ersatz für $ sein, wenn garantiert ist, dass STR mindestens 7 Zeichen enthält. Wenn es kürzer sein könnte, wird sich OS X bash außerdem über negative Längen beschweren oder bei bash-Versionen, die negative Längen als Versatz von rechts betrachten, furchtbar falsch laufen.

Thx, hat den Trick für mich getan Jean-Bernard Jansen vor 5 Jahren 0
2
kayahr

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 $ - 6 - 1))} 

Im Detail:

  • ${#STR} gibt die Länge der Zeichenfolge zurück.
  • $((a - b - c)) tut mathematische Subtraktion
  • $ gibt einen Teilstring zurück.

Das zweite Argument für den Teilzeichenfolgenausdruck ist also die Länge der Zeichenfolge minus dem Startversatz minus dem Wert, den Sie in der neueren Bash-Syntax als negativen Wert angeben würden.