Zuweisen nur eines Teils einer Zeichenfolge zu einer Variablen in bash

11

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

Der absolute Pfad könnte beispielsweise sein:

/home/myusername/folder1/folder2/folder3

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

/folder1/folder2/folder3

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

Life of Pi: Schiffbruch mit Tiger
quelle
Ist /home/usernamedas tatsächliche $HOMEVerzeichnis des aufrufenden Benutzers? Wenn ja, könnten Sie es einfach mit mydir="${target_path#$HOME}"Ich denke entfernen
Steeldriver

Antworten:

15

Verwenden der String-Manipulation von bash :

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

Die gewünschte Zeichenfolge wäre also (Hinzufügen des führenden Schrägstrichs):

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

Für eine Variable a, ${a#foo}wird das kürzeste String - Matching entfernt fooaus dem Anfang von a. Wir entfernen also die kürzeste Zeichenfolge, die drei enthält /(einschließlich des führenden Schrägstrichs im Pfad), um die ersten beiden Komponenten des absoluten Pfads zu entfernen.

muru
quelle
Der Pfad kann 30 Ordner umfassen, und ich möchte nur die letzten 28 einschließen. Funktioniert das noch?
Leben von pi
@Lifeofpi warum nicht?
Muru
9

Hier ist ein Beispiel mit cut

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

folder1/folder2/folder3

Wenn Sie die Führung benötigen, können /Sie sie | sed 's/^/\//'an das Ende Ihrer Zeile anhängen .

Sie müssen -f4-da -d '/'sagt die cutVerwendung /als Trennzeichen zwischen den Feldern. Das erste Feld steht also vor dem ersten Trennzeichen, in diesem Fall ist das erste Feld leer. So folder1ist das 4. Feld und -f4-sagt cut, dass alle Felder ab dem 4. verwendet werden sollen.

guntbert
quelle
7

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

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

Danach:

echo $myvar

gibt:

/folder1/folder2/folder3

Es funktioniert, indem die erste Übereinstimmung des Musters /*/*/aus Ihrer Variablen target_path entfernt wird, indem die ${target_path#pattern}Shell-Parametererweiterungssyntax verwendet 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 so etwas ausführen rm -rf "$myvar"*. Versuch das nicht!

Arronisch
quelle
Der Pfad kann 30 Ordner umfassen, und ich möchte nur die letzten 28 einschließen. Funktioniert das noch?
Leben von pi
Auf jeden Fall werden nur die ersten beiden abgeschnitten, unabhängig von der Länge des Pfads.
Arronical