Zunächst sollten Sie explizit angeben, was Sie möchten. Wenn Sie wissen, dass die Zeichenfolge endet .rtf
und Sie die Zeichenfolge entfernen möchten .rtf
, können Sie sie verwenden var2=${var%.rtf}
. Wenn Sie das Suffix nicht kennen, aber alles ab dem letzten entfernen möchten, .
können Sie es verwenden var2=${var%.*}
. Wenn Sie nur alles auf dem neuesten Stand halten möchten .
, können Sie verwenden var2=${var%%.*}
. Diese beiden letzten Optionen haben das gleiche Ergebnis, wenn es nur einen Zeitraum gibt. Wenn es jedoch mehr als einen gibt, sollten Sie entscheiden, welchen Sie möchten.
Wenn Sie wirklich immer eine genaue Anzahl von Zeichen entfernen möchten, finden Sie hier einige Optionen.
Sie haben Bash speziell angegeben, daher beginnen wir mit Bash-Buildins. Diejenige, die am längsten funktioniert hat, ist dieselbe Syntax zum Entfernen von Suffixen, die ich oben verwendet habe: Um vier Zeichen zu entfernen, verwenden Sie var2=${var%????}
. Sie müssen ein Fragezeichen pro entferntem Zeichen entfernen, damit dies bei größeren Teilstringlängen unhandlich wird.
Etwas neuer ist die Teilstring-Extraktion : var2=${var::${#var}-4}
. Hier können Sie eine beliebige Zahl anstelle von setzen 4
, um eine andere Anzahl von Zeichen zu entfernen. (Das ${#var}
wird durch die Länge der Zeichenfolge ersetzt, daher werden tatsächlich die ersten (Länge - 4) Zeichen beibehalten.)
Mit neueren Versionen von Bash (speziell 4+, dh die mit MacOS gelieferte Version funktioniert nicht) können Sie dies einfach vereinfachen var2=${var::-4}
.
Wenn Sie nicht Bash verwenden, sondern eine andere POSIX-Shell, funktioniert das Entfernen von Suffixen auch in einem einfachen alten Bindestrich (wo keiner der anderen dies tut). In zsh funktionieren alle, aber Sie müssen ein 0
zwischen die Doppelpunkte setzen: var2=${var:0:-4}
usw. In ksh benötigen Sie die 0 und müssen auch den expliziten Ausdruck der Länge 4 verwenden : var2=${var:0:${#var}-4}
.
Sie können die Befehlssubstitution natürlich auch mithilfe eines Hilfsprogramms verwenden. Es gibt viele, die funktionieren werden, aber so etwas var2=$(cut -c -4 <<<"$var")
ist wahrscheinlich die kürzeste Option.