Zuweisung nur eines Teils einer Zeichenkette an eine Variable in bash

11

Ich erhalte vom Benutzer einen bestimmten absoluten Dateipfad, und ich möchte eine Variable erstellen, die eine Zeichenfolge enthält, die nicht nur die FIRST zwei Komponenten des Dateipfads enthält, sondern ohne zu drucken es oder irgendetwas.

Der absolute Pfad könnte beispielsweise lauten:

/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.

    
Life of pi 10.11.2016, 14:56
quelle

3 Antworten

15

Bash-String-Manipulation :

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

Die gewünschte Zeichenfolge wäre also (den führenden Schrägstrich hinzufügen):

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

Bei einer Variablen a entfernt ${a#foo} die kürzeste Übereinstimmung foo von start von a . Also entfernen wir 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 10.11.2016, 15:08
quelle
9

Hier ist ein Beispiel mit cut

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

folder1/folder2/folder3

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

Sie benötigen -f4- , weil -d '/' % cut angibt, um / als Trennzeichen zwischen Feldern zu verwenden. Das erste Feld kommt also vor dem ersten Trennzeichen, in diesem Fall ist das erste Feld leer. So ist folder1 das vierte Feld und -f4- sagt cut um alle Felder ab dem 4. zu verwenden.

    
bc2946088 10.11.2016 15:07
quelle
7

Sie können die bash-Parameter-Erweiterung wie folgt 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 /*/*/ aus der Variablen Zielpfad entfernt wird, indem die Syntax für die Erweiterung ${target_path#pattern} Shell-Parameter verwendet wird. Leider entfernt dies das erste / -Zeichen, weshalb dieses Zeichen explizit enthalten sein muss, während die Variable myvar gesetzt wird.

Warnung: Sie sollten überprüfen, ob die Variable Zielpfad 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 könnte für Ihr System gefährlich sein, wenn Sie etwas wie rm -rf "$myvar"* ausführen. Versuche das nicht!

    
Arronical 10.11.2016 15:09
quelle