it-swarm.com.de

Zuweisen nur eines Teils einer Zeichenfolge zu einer Variablen in Bash

Ich erhalte vom Benutzer einen bestimmten absoluten Dateipfad und möchte eine Variable erstellen, die eine Zeichenfolge ist, die nicht nur die beiden Komponenten FIRST des Dateipfads enthält, sondern diese auch nicht druckt oder irgendwas.

Der absolute Pfad könnte beispielsweise sein:

/home/myusername/folder1/folder2/folder3

Und es ist in "target_path" gespeichert, und ich möchte "mydir" nur sein:

/folder1/folder2/folder3

Ich habe versucht, den Befehl cut auf verschiedene Arten zu verwenden, aber ohne Erfolg.

11
Life of pi

Mit Bashs String-Manipulation :

$ a=/home/myusername/folder1/folder2/folder3
$ echo "${a#/*/*/}"
folder1/folder2/folder3

Die Zeichenfolge, die Sie möchten, würde also lauten (und den führenden Schrägstrich hinzufügen):

b="/${a#/*/*/}"

Für eine Variable a entfernt ${a#foo} die kürzeste Zeichenfolge, die foo entspricht, aus dem Anfang von a. Also entfernen wir die kürzeste Zeichenfolge mit drei / (einschließlich des führenden Schrägstrichs im Pfad), um die ersten beiden Komponenten des absoluten Pfads zu entfernen.

15
muru

Hier ist ein Beispiel mit cut

echo "/home/myusername/folder1/folder2/folder3" | cut -d '/' -f4- 

folder1/folder2/folder3

Wenn Sie den führenden / benötigen, können Sie | sed 's/^/\//' an das Ende Ihrer Zeile anhängen.

Sie benötigen -f4-, da -d '/'cut anweist, / als Trennzeichen zwischen Feldern zu verwenden. Das erste Feld steht also vor dem ersten Begrenzer, in diesem Fall ist das erste Feld leer. Also ist folder1 das 4. Feld und -f4- weist cut an, alle Felder ab dem 4. zu verwenden.

9
user508889

Sie können die Bash-Parameter-Erweiterung folgendermaßen verwenden:

target_path=/home/username/folder1/folder2/folder3
myvar="/${target_path#/*/*/}"

Danach:

echo $myvar

gibt:

/folder1/folder2/folder3

Dies funktioniert, indem die erste Übereinstimmung des Musters /*/*/ mit der Shell-Parametererweiterungssyntax ${target_path#pattern} aus Ihrer Zielpfadvariablen entfernt wird. Leider wird dadurch das erste / -Zeichen entfernt, weshalb dieses Zeichen beim Festlegen der Variablen myvar explizit eingeschlossen werden muss.

Warnung: Sie sollten überprüfen, ob Ihre Variable target_path einige Zeichen enthält und länger als zwei Pfadsegmente ist, bevor Sie diese Methode verwenden. Zum Beispiel, wenn target_path=/home/username/, dann myvar=/. Dies kann für Ihr System gefährlich sein, wenn Sie etwas wie rm -rf "$myvar"* ausführen. Versuchen Sie das nicht!

7
Arronical