2011-03-19 35 views
17

Bir dosyanın uzantısını kaldırmak için nasıl bilmeden dosyadan uzantıyı kaldırma:Ben olarak bile bile,

nameis=$(basename $dataset .csv) 

ama önceden bilmeden herhangi bir uzantıyı kaldırmak istediğiniz, herkes biliyor nasıl Bunu yap?

Herhangi bir yardım takdir, Ted

aşağıdakileri yapabilirsiniz bash ise

cevap

27

:

nameis=${dataset%.*} 

... örn: Bu sözdizimi bash adam sayfasında açıklanan

$ dataset=foo.txt 
$ nameis=${dataset%.*} 
$ echo $nameis 
foo 

gibi:

$ {param eter% kelimesi}

$ {parametre %% sözcük}

Kaldır eşleşen sonek modeli. Sözcük, yol adı genişletme işleminde olduğu gibi bir model oluşturmak için genişletilir. Kalıp, parametrenin genişletilmiş değerinin izleyen bir kısmı ile eşleşiyorsa, genişlemenin sonucu, en kısa eşleşen kalıpla ("%" durumu) veya en uzun eşleşen kalıpla ("%%") genişletilmiş parametrenin değeridir.) silindi. Parametre @ veya * ise, model kaldırma işlemi sırayla her bir konum parametresine uygulanır ve genişletme sonuç listesidir. Parametre, @ veya * ile abone edilen bir dizi değişkeni ise, sırayla dizinin her üyesine desen kaldırma işlemi uygulanır ve genişletme, sonuç listesidir.

1

${dataset%.*} gibi bir şey işe yarayabilir; Ancak, uzantısına sahip olmayan dosyalarına dikkat edin, çünkü bir uzantının parçası olmayan bir noktaya bakacağız.

nameis=$(echo $filename | sed 's/\.[^.]*$//') 

Ama bu tür .tar.gz gibi çift uzantılı dosyalar üzerinde işe yaramaz:

1

varsa Sen sed ile son nokta şu şeyi kaldırabilir.

0

yerine böyle bunun için basename kullanım sed komuta altına alınmasının öneririm:

echo "$fileName" | sed 's/\..*$//g'

+0

Örneğin, 'foo.bar.baz' adlı bir dosya, sonucun' foo.bar' olmasını ister. –

+0

Bu benim için oldukça iyiydi, çünkü dosya adının maalesef dizinde bir noktaya sahip olduğunda 'foo' olmasını istemiştim. –

1

nameis = $ {. Veri kümesi %% *} senin basenames hiçbiri içinde bir nokta bulunur varsayar. Bu, en uzun olası sonsuz dizgiyi sola döndürür.

5

Şimdi, bazı şık eski okul Regexp'i istiyorsanız:

echo "foo.bar.tar.gz" | sed "s/^\(.*\)\..*$/\1/" 

-> döneceğiz: foo.bar.tar

 
I will break it down: 
s/ Substitute 
^  From the beginning 
\( Mark 
.*  Everything (greedy way) 
\)  Stop Marking (the string marked goes to buffer 1) 
\.  until a "." (which will be the last dot, because of the greedy selection) 
.*  select everything (this is the extension that will be discarded) 
$  until the end 
/ With (substitute) 
\1  The buffer 1 marked above (which is the filename before the last dot(.) 
/ End 

Cristiano Savino

bir başarısız olur
+0

Açıklama için teşekkürler! –

İlgili konular