• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

(gelöst) Pfad aus string extrahieren

droda

Newbie
Hallo mitteinander,

an diesem kleinen Problem Sitze ich nun mehr als 3 Tage.
Hatte vor selbst auf eine Lösung zu kommen, bin aber nun zu dem Schluss gekommen, das ich selbst auf keine komme.

Ich habe es mit sed, grep, etc. durch probiert, aber bisher nichts passendes dabei.


Ich hab eine Variable, diese so aussieht, kann aber variieren.
Es gibt aber immer nur einen Pfad.
Aus diesem möchte ich nun die ersten beide Teile vom Pfad extrahieren.
Bsp.: test=xxxxx:/pfad1/pfad2/pfad3/pfad4/test.bin
Also: /pfad1/pfad2/


Diese möchte ich per echo ausgeben.

Also echo $test | sed/grep etc...

Eigentlich müsste ich eigentlich nur das erste / finden und noch bis zu zwei weitere markieren.
Ich habe sicherlich über 50 Kombinationen probiert, aber bis auf "/pfad1/pfad2/pfad3/pfad4/test" bin ich nicht weiter gekommen.

Vielen Dank und viele Grüße
 

framp

Moderator
Teammitglied
Das Stichwort ist hier reguläre Ausdrücke (regular Expression). Diese kannst du sowohl bei sed als auch grep benutzen um genau den Teil aus dem String zu extrahieren den du benötigst :wink:
 
OP
D

droda

Newbie
Danke,

mit regex kenne ich mich schon halbwegs aus.

Trotzdem bin ich nicht weiter gekommen... Bis jetzt.
Wirklich gerade die Lösung für mich gefunden...

| grep -o -E "\/[[:alnum:]]+\/[[:alnum:]]+\/"

Ist beliebig erweiterbar.
 
Ich habe das nicht ausprobiert, aber das kannst du selbst nachholen

# VAR="xxxxx:/pfad1/pfad2/pfad3/pfad4/test.bin"
# echo $(grep -P -o "\/\w+\/\w+\/" <<< "$VAR")

Gruß
Gräfin Klara
 

abgdf

Guru
Code:
#!/bin/bash
test=xxxxx:/pfad1/pfad2/pfad3/pfad4/test.bin
echo $test | awk -F "/" '{printf "/%s/%s/\n", $2, $3}'
Wenn man was zu splitten hat, ist awk ganz praktisch.
Perl tut's auch, robi findet aber, der Interpreter sei dafür übermäßig groß. awk ist sicher kleiner.
 

framp

Moderator
Teammitglied
abgdf schrieb:
Wenn man was zu splitten hat, ist awk ganz praktisch.
cut ist da noch praktischer und lightweight ;)
Code:
t="xxxxx:/pfad1/pfad2/pfad3/pfad4/test.bin"; cut -f 2-3 -d / <<< "$t"
Eine Variante mit sed:
Code:
t="xxxxx:/pfad1/pfad2/pfad3/pfad4/test.bin"; sed -r 's/[^:]+:((\/[^/]+){2})(.*)/\1/' <<< "$t"
Eine reine bash Variante mit read:
Code:
t="xxxxx:/pfad1/pfad2/pfad3/pfad4/test.bin"; IFS='/' read x a b y <<< "$t"; echo "/$a/$b"
Eine reine bash Variante mit set:
Code:
t="xxxxx:/pfad1/pfad2/pfad3/pfad4/test.bin"; IFS=/ eval set -- \$t; echo "/$2/$3"
Die beiden letzten sind vermutlich die schnellsten Varianten.
 
Oben