Ich habe eine Variable var
in einem Bash-Skript, die eine Zeichenfolge enthält, wie:
echo $var
"some string.rtf"
Ich möchte die letzten 4 Zeichen dieser Zeichenfolge entfernen und das Ergebnis einer neuen Variablen zuweisen var2
, damit
echo $var2
"some string"
Wie kann ich das machen?
Antworten:
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 verwendenvar2=${var%.rtf}
. Wenn Sie das Suffix nicht kennen, aber alles ab dem letzten entfernen möchten,.
können Sie es verwendenvar2=${var%.*}
. Wenn Sie nur alles auf dem neuesten Stand halten möchten.
, können Sie verwendenvar2=${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 setzen4
, 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.quelle
Sie können dies tun:
quelle
bash
4+, aber in früheren Versionen können Sie die etwas länger verwenden${v::${#v}-4}
.${v::-4}
krächzt in zsh "zsh: schließende Klammer erwartet". Aber die Antwort von @fredtantini unten${v:0:-4}
funktioniert gut.Um vier Zeichen am Ende der Zeichenfolge zu entfernen, verwenden Sie
${var%????}
.Alles nach dem endgültigen
.
Gebrauch entfernen${var%.*}
.quelle
${var#????}
.Was für mich funktioniert hat war:
Aber ich habe es verwendet, um Linien in einer Datei zu schneiden, deshalb sieht es unangenehm aus. Die wirkliche Verwendung war:
cut
bringt Sie nur so weit, dass Sie von einer Startposition aus trimmen, was schlecht ist, wenn Sie Zeilen mit variabler Länge benötigen. Diese Lösung kehrt alsorev
den String um ( ) und jetzt beziehen wir uns auf seine Endposition, verwenden ihn danncut
wie erwähnt und kehren ihn (wiederrev
) in seine ursprüngliche Reihenfolge zurück.quelle
rev
kehrt Zeilen um, keine Zeichenfolgen.echo $SOME_VAR | rev | ...
wird sich wahrscheinlich nicht so verhalten, wie man es erwarten würde.Verwenden der variablen Erweiterung / Ersetzen des Teilstrings :
So können Sie tun:
Alternative,
Wenn Sie immer die gleichen 4 Buchstaben haben
Wenn es immer endet mit
.xyz
:Sie können auch die Länge der Zeichenfolge verwenden:
oder einfach
echo ${var::-4}
quelle
len=${#var}; echo ${var::len-4}
könnte verkürzt werden aufecho ${var:0:-4}
:-) EDIT: oder wie @iyonizer betonte, nurecho ${var::-4}
...Sie könnten sed verwenden,
Beispiel:
quelle
var2
?Ich habe folgendes versucht und es hat bei mir funktioniert:
Ausgabe:
hel
quelle
Hoffe das folgende Beispiel wird helfen,
echo ${name:0:$((${#name}-10))}
->${name:start:len}
start
ist der String-Startpunktlen
ist die Länge der Zeichenfolge, die entfernt werden muss.Beispiel:
Ausgabe:
Hinweis: Bash 4.2 hat Unterstützung für negative Teilzeichenfolgen hinzugefügt
quelle
Dies funktionierte für mich durch Berechnung der Größe der Zeichenfolge.
Es ist einfach, den zurückgegebenen Wert wiederzugeben und ihn dann wie unten zu speichern
quelle
In diesem Fall können Sie den Basisnamen verwenden, vorausgesetzt, Sie haben dasselbe Suffix für die Dateien, die Sie entfernen möchten.
Beispiel:
Wenn Sie das Suffix nicht kennen und möchten, dass alles nach und einschließlich des letzten Punkts entfernt wird:
% bedeutet hacken ,. ist, was Sie hacken, * ist Platzhalter
quelle