Suche sed/awk Ausdruck, bin leider zu doof

stormtide

stormtide

Grünschnabel
Hallo zusammen

Ich suche einen sed/awk Ausdruck, der mir der Speicherort einer Datei liefert.
Wenn ich also z.B. den String /home/ich/dateien/bilder/bild.jpg habe, möchte ich den Rückgabewert "bilder".
Der Ausdruck soll nicht abhängig von der Pfadtiefe sein, jedoch immer den "tiefsten" Ordner abfragen.
Kann mir jemand so einen Ausdruck machen?
Ich bin wohl zu blöde dafür... ?(

Vielen lieben Dank
Andy
 
Wirklich sehr Quick'n'Dirty... :D
Code:
pfad=""; pfad=/home/ich/dateien/bilder/bild.jpg; gl=${#pfad}; sos=${pfad//\//}; los=${#sos}; sn=$(($gl - $los)); echo $pfad | awk -v so=$sn -F"/" '{ print $so }'
bilder
 
mac:~ Andy$ echo "/Users/Andy/Test/Image.jpg" | sed -e 's/.*\/(.*)\/.*\.jpg.*/'
sed: 1: "s/.*\/(.*)\/.*\.jpg.*/
": unescaped newline inside substitute pattern

habs gerade mit dem obenstehenden versucht und ensprechende fehlermeldung erhalten - weiss jemand warum?
 
Tut es nicht vielleicht auch ein basename? Ist etwas einfacher:

Code:
roadtrip)0)502)~} basename /ichexistierenicht/ichauchnicht.jpg .jpg
ichauchnicht

{edit}
Verlesen. Ich lasse es trotzdem mal stehen, sonst sieht das Posting so leer aus ;)

{edit II}
Ich hab mal was mit Perl probiert. Vielleicht funktionierts ja für dich:

Code:
roadtrip)0)548)~} cat tt
/ichexistierenicht/asdf/ichauchnicht.jpg
roadtrip)0)549)~} perl -nle 'my $rev = reverse; if ($rev =~ s#gpj.[^/]+/([^/]+)/.*#$1#) { $rev = reverse $rev; print $rev;}' < tt
fdsa

{edit III}
Du musst Klammern auch escapen.
 
Zuletzt bearbeitet:
Geht ganz einfach mit der Kombination von 'dirname' und 'basename':
Code:
basename $(dirname /home/ich/dateien/bilder/bild.jpg)
bilder
Grüsse
d22
 
Wollte schon einen Ausdruck, den ich auch versteh' :)

Vielen Dank für die Mühe.
Ich habe inzwischen die "schöne" Lösung gefunden:

Code:
dirname /home/andy/test/celica/hallo.jpg | xargs basename

Edit: oh, da war ich wohl etwas zu übereifrig ^^
Vielen Dank!!!
 
Haha, super, ich kannte dirname noch gar nicht. Danke! :)

{edit}
Auch wenn ich anfange, Selbstgespräche zu führen: Es hat mir keine Ruhe gelassen, dass die Perl-Zeile so kompliziert aussah. So geht es einfacher :)

Code:
perl -ne '$_ = reverse; print scalar reverse if s#gpj.[^/]+/([^/]+)/.*#$1#' < tt
oder
perl -ne 'print scalar reverse if ($_ = reverse) && (s#gpj.[^/]+/([^/]+)/.*#$1#)' < tt
 
Zuletzt bearbeitet:
< brauchst du nicht. und die ( ) um den substitutions befehl auch nicht.
Code:
perl -ne 'print [split /\//]->[-1] ' <<< /home/ich/dateien/bilder/bild.jpg
 
Zuletzt bearbeitet:
Hmm mit 'sed':
Code:
echo /home/test/texte/privat/text.jpg | sed 's:.*/\(.*\)/.*$:\1:'
privat
Ginge es auch eleganter?
Gruss
d22
 
Tolle Lösungen. Immer interessant zu sehen, wie viele Wege es gibt.

@smg: Da müsste -2 anstelle von -1 stehen, da er ja den Ordner und nicht das Bild haben möchte. Funktioniert zumindest bei mir nur so. Wusste gar nicht, dass es negative Array-Elemente gibt?

@dizzgo: Ich habe immer Respekt vor dem dot-star. Daher dachte ich, es sei einfacher, den String umzudrehen, weil mM nach die regex dann eindeutiger wird. Vielleicht auch zu kompliziert von mir gedacht ...
 

Ähnliche Themen

Suchen und Ersetzen mit regulärem Ausdruck

3 letzte Zeile löschen oder ab Zeile 55 Muster suchen und löschen

Sed od. Awk - Ersetzen unbekannter parameter

Samba Update von 3.2.5 auf 3.5.6 - Probleme beim Server Browsen

[HowTo] NVidia und 3D unter SuSE/openSUSE

Zurück
Oben