2015-05-11 195 views
4

比方说,我有一个字符串:删除一切,但文件扩展名

x=file.tar.sh 

我知道如何删除一切,但最后n个字符。像这样(去除一切,但最后3个字符:!

${x: -3} 

但是,这并不具有不同后缀的长度文件的工作(LEN的.tar = LEN .SH)

我会通过删除解决这个。一切直到最后点我已经试过这样:“”?

${x##.} 

这消除了最长匹配,直到但不知何故,它只是返回完整的字符串没有消除任何

+0

发生前你的任务是错误的应该是这个'x = file.tar.sh' – Azad

+1

你似乎误解了什么'$ {x# #。}'应该做的。由于给定的模式只匹配单个文字字符串,因此它只会移除一个前导句点,并且与'$ {x#。}'完全相同。 – chepner

回答

2

试试这个:

x=file.tar.sh 
echo ${x##*.} 

这将打印sh

如果你想获得tar.sh,则:

echo ${x#*.} 

这里*匹配任何字符集的.

+0

谢谢,这有效,但我不明白需要“*”。使用特殊字符时必须使用它吗? – mythic

+2

Jahid没有解释的是他使用**参数扩展/子串提取**来解析线路以去除路径中不需要的部分。 '##'从左侧开始,然后匹配**所有出现的模式**'* .'(它说明匹配所有到最后一个“。”)。 **是零个或多个任意字符**的通配符。一个'#'匹配**模式**的第一个匹配项。 –

+0

好吧,我真的没有得到的唯一的东西是通配符部分。感谢您为我清理这些,我很感激。 – mythic