2010-03-24 168 views
1

我有一個類似sample.txt.pgp的字符串,我想在shell腳本中返回sample.txt(但是,字符串長度會有所不同,因此基本上是「.pgp」之前的所有字符)。是否有一個substr函數?就像,如果我做substr('sample.txt.pgp', -4, 0),它應該返回sample.txt?現在它不是,所以我想知道如果我的語法錯了,或者substr不是函數?shell腳本中的Unix substr?

回答

2

您可以使用basename

$ basename sample.txt.pgp .pgp 
sample.txt 

使用反引號或$()把結果在一個變量,如果你想:

$ FILE=sample.txt.pgp 
$ VARIABLE=$(basename "$FILE" .pgp) 
$ echo $VARIABLE 
sample.txt 
+2

有趣的是,你使用'-s後綴'符號;這不是由POSIX標準化的;經典符號將是'$(basename $ file .pgp)'(假設名稱保存在變量'$ file'中)。 – 2010-03-24 21:25:44

+1

@Jonathan是的!我剛剛在我的OS X機器上做了一個'man basename',並且看到了'-s'選項;它有點更靈活(可以處理多個字符串),我不知道它不是POSIX。我會編輯我的答案。 – 2010-03-24 21:40:00

+1

已編輯;我也放了一些雙引號來支持文件名中的空格。 – 2010-03-24 21:41:59

0

filename sample.txt.pgp返回sample.txt,我相信。 (使用反引號)

+0

我不認爲我看到這個命令安裝在我的任何系統上... – Cascabel 2010-03-24 20:52:28

+1

@Jefromi:我認爲他們指的是'basename'。 – 2010-03-24 21:02:25

+0

哎呀,是的。 basename – Cheeso 2010-03-24 21:23:13

3
a='sample.txt.pgp' 
echo ${a%.*} # sample.txt (minimal match) 
echo ${a%%.*} # sample  (maximal match) 
+0

這看起來很有趣......美元符號和%代表什麼?你有一個網頁有點解釋這個或任何東西? – TwixxyKit 2010-03-24 20:59:00

+0

@KnockKnockWhosThere:請閱讀http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02瞭解更多信息。 :-) – 2010-03-24 21:00:44

+2

而一個更受限制的版本:'$ {a%.pgp}'只會刪除一個'.pgp'擴展名(如果存在的話);原文將根本刪除任何擴展名(這在某些情況下可能有用)。 – 2010-03-24 21:27:14