仅从文件名中删除最后一个扩展名

时间:2013-08-15 10:43:21

标签: bash file edit tcsh

我的文件名看起来与此类似

name_1.23.ps.png

name_1.23.ps.best

name_1.23.ps

我想在最后删除随机文件扩展名,只留下

name_1.23.ps

与此类似的其他问题'。'作为一个熟食店,但这会删除name_1后的所有内容。

我想在命令行上执行此操作(在tcsh或bash中)

3 个答案:

答案 0 :(得分:3)

检查这是否符合您的要求:

<强> SED

sed 's/\.[^.]*$//'

<强>的grep

grep -Po '.*(?=\.)'

试验:

kent$  cat f
name_1.23.ps.png
name_1.23.ps.best
name_1.23.ps
name_1.23.ps

#sed:
kent$  sed 's/\.[^.]*$//' f
name_1.23.ps
name_1.23.ps
name_1.23
name_1.23

#grep
kent$  grep -Po '.*(?=\.)' f
name_1.23.ps
name_1.23.ps
name_1.23
name_1.23
来自评论的

编辑。我觉得这将是新的要求:

<强>的grep

kent$  grep -o '.*\.ps' f                                                                                         
name_1.23.ps
name_1.23.ps
name_1.23.ps
name_1.23.ps

<强> SED

kent$  sed 's/\(.*\.ps\)\..*/\1/' f
name_1.23.ps
name_1.23.ps
name_1.23.ps
name_1.23.ps

答案 1 :(得分:2)

我们可以使用bash字符串操作从字符串后面删除glob patten的最短匹配。我们将使用&#34;。*&#34;对于glob模式。

filename="name_1.23.ps.png"                                                      
echo ${filename%.*}                                                              
# the above output name_1.23.ps

这个答案更适合我自己的参考,因为我几次回到这个页面。 (如果仅以&#39; .ps&#39;)结束,它不满足OP的原始字符串相同的附加要求。

答案 2 :(得分:-1)

试试这个:

string="name_1.23.ps.png"
array=(${string//./ })
echo "${array[0]}.${array[1]}.${array[2]}"