我知道怎麼刪除文件的擴展名,當我知道它:去除文件擴展名不知道它
nameis=$(basename $dataset .csv)
,但我想刪除任何分機不知道這一點,事前,任何人都知道如何做這個?
任何幫助表示讚賞, 特德
我知道怎麼刪除文件的擴展名,當我知道它:去除文件擴展名不知道它
nameis=$(basename $dataset .csv)
,但我想刪除任何分機不知道這一點,事前,任何人都知道如何做這個?
任何幫助表示讚賞, 特德
在bash,你可以做到以下幾點:
nameis=${dataset%.*}
...如:
$ dataset=foo.txt
$ nameis=${dataset%.*}
$ echo $nameis
foo
此語法在bash的手冊頁描述as:
$ {param ETER%字}
$ {參數%%字}
刪除匹配的後綴模式。這個詞被擴展爲產生一個模式,就像路徑名擴展一樣。如果模式與參數擴展值的尾部相匹配,則擴展結果是具有最短匹配模式(「%」情況)或最長匹配模式(「%%」情況)已刪除。如果參數是@或*,則模式刪除操作將依次應用於每個位置參數,並且擴展是結果列表。如果參數是以@或*爲下標的數組變量,則將模式刪除操作依次應用於數組的每個成員,並且擴展是結果列表。
像${dataset%.*}
可能工作;不過,請注意文件沒有擴展名,因爲它會查找不是要刪除的擴展名的一部分。
你可以,如果任何最後的點以下除去一切,與sed
:
nameis=$(echo $filename | sed 's/\.[^.]*$//')
但是,這不會對文件具有雙擴展名,如.tar.gz
工作。
我會建議,而不是basename
使用sed
命令,像這樣:
echo "$fileName" | sed 's/\..*$//g'
nameis = $ {。數據集%% *} 假設你沒有的基本名稱有一個句點。這會從左側返回儘可能長的無點串。現在
,如果你想要一些時尚的老學校正則表達式:
echo "foo.bar.tar.gz" | sed "s/^\(.*\)\..*$/\1/"
- >應返回: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
克里斯蒂亞諾薩維諾
感謝您的解釋! – 2015-10-09 12:45:28
將爲故障如果你想讓結果成爲'foo.bar',那麼文件名就是'foo.bar.baz'。 – 2011-03-19 22:50:55
這對我來說非常好,因爲我不希望文件名是'foo',不幸的是當目錄中有一個點時,它就會失敗。 – 2016-09-13 11:35:22