2010-07-04 3 views
7

Wie das letzte dir mit sed entfernen, wie folgt aus:Wie entferne ich das letzte Verzeichnis von einem Pfad mit sed (ohne dirname)?

echo "/dir1/dir2/dir3/dir4" | sed ..... 

So würde ich /dir1/dir2/dir3 bekommen.

+0

Bitte, mehr Aufmerksamkeit auf die Formatierung zahlen und Formulierung Ihrer Antworten. –

+1

@Pavel: ummm, errrr, Fragen? (und Kommentare) ;-) –

+1

@Dennis, EPIC fehlgeschlagen, nicht behebbar :-D –

Antwort

7
sed 's,/*[^/]\+/*$,,' 

Wenn es Teil des Shell-Skript ist, dann wird dirname definitiv klar sein.

+0

Dies funktioniert nicht, wenn das Verzeichnis ein "." (Zeitraum) in seinem Namen –

+0

@ChrisF Huh? Warum hast du so geschrieben? 'echo a.b/c.d/e.f | sed 's,/* [^ /] \ +/* $ ,,' 'gibt' a.b/c.d' zurück oder in Ihrer sed-Version nicht? Meine Regexp hat überhaupt nichts mit "." Zu tun. – przemoc

3

echo "/ etc1/etc2/etc3/etc" | sed -e "s // [^ /] * $ //"

produziert

/ETC1/etc2/etc3

Im Grunde alles, was am Ende nach dem letzten Schrägstrich abzustreifen, die nicht der Fall ist einen weiteren Schrägstrich enthalten

+1

Hoppla, die Verwendung von Kommas als Trennzeichen wie in Przemoc angegeben, wäre besser, um zu vermeiden, dass die Schrägstriche im Skript entfernt werden müssen, damit es lesbarer wird. Ich mache immer diesen Fehler. –

24

Sie müssen externe Tools nicht verwenden

$ a="/dir1/dir2/dir3/dir4"

$ echo ${a%/*}

+0

Während die derzeit angenommene Antwort definitiv gut ist, glaube ich, dass diese die akzeptierte Antwort sein sollte, wenn die Frage zu bash gehört. Die Bash-Parameter-Substitution fühlt sich einfach "wahrer" bash als sed an. – anuragw

0

Sie "dirname" Shell-Befehl verwenden können:

dirname /dir2/dir3/dir4 
Verwandte Themen