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.
command-line
bash
environment-variables
Life of Pi: Schiffbruch mit Tiger
quelle
quelle
/home/username
das tatsächliche$HOME
Verzeichnis des aufrufenden Benutzers? Wenn ja, könnten Sie es einfach mitmydir="${target_path#$HOME}"
Ich denke entfernenAntworten:
Verwenden der String-Manipulation von bash :
Die gewünschte Zeichenfolge wäre also (Hinzufügen des führenden Schrägstrichs):
Für eine Variable
a
,${a#foo}
wird das kürzeste String - Matching entferntfoo
aus dem Anfang vona
. 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.quelle
Hier ist ein Beispiel mit
cut
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 diecut
Verwendung/
als Trennzeichen zwischen den Feldern. Das erste Feld steht also vor dem ersten Trennzeichen, in diesem Fall ist das erste Feld leer. Sofolder1
ist das 4. Feld und-f4-
sagt cut, dass alle Felder ab dem 4. verwendet werden sollen.quelle
Sie können die Bash-Parametererweiterung folgendermaßen verwenden:
Danach:
gibt:
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/
, dannmyvar=/
. Dies kann für Ihr System gefährlich sein, wenn Sie so etwas ausführenrm -rf "$myvar"*
. Versuch das nicht!quelle