2010-07-04 21 views
7

böyle, sed ile son dir nasıl kaldırılır:Son dizini sed ile bir yoldan nasıl kaldırılır (dirname kullanmıyor)?

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

Yani /dir1/dir2/dir3 tanınacak. o kabuk parçası ise

+0

, biçimlendirme daha fazla dikkat edin ve Cevapların ifadesi. –

+1

@Pavel: ummm, errrr, sorular? (ve yorumlar) ;-) –

+1

@Dennis, EPIC başarısız, kurtarılamaz: -D –

cevap

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

ardından dirname kesinlikle daha net olacaktır.

+0

Dizinde "." varsa, bu çalışmaz (dönem) ismiyle –

+0

@ChrisF Huh? Neden böyle yazdın? echo a.b/c.d/e.f | sed 's,/* [^ /] \ +/* $ ,,' 'a.b/c.d' döndürür ya da sed sürümünde yok mu? Benim regexp'in '' ile hiç ilgisi yok. – przemoc

3

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

üretir

/etc1/etc2/vb 3.

Temelde değil son çizgiden sonra sonunda herhangi bir şey kapalı şerit başka bir eğik çizgi içerir.

+1

Oops, virgüllerin, przemoc gibi sınırlayıcı olarak kullanıldığını, betikteki eğik çizgiden kaçmaktan kaçınmak için daha kolay okunabilir. Ben her zaman böyle bir hata yaparım. –

24

Harici araçları

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

$ echo ${a%/*}

+0

Şu anda kabul edilen cevap kesinlikle iyi olsa da, sorunun bash ile ilgili olması durumunda bunun kabul edilen cevap olması gerektiğine inanıyorum. Bash parametre ikamesi, sed'den daha "gerçek" bash hisseder. – anuragw

0
kullanabilirsiniz

"birdizin" kabuk komutunu kullanmak zorunda değilsiniz:

dirname /dir2/dir3/dir4