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

use*_*508 1 bash file edit tcsh

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

name_1.23.ps.png
Run Code Online (Sandbox Code Playgroud)

要么

name_1.23.ps.best
Run Code Online (Sandbox Code Playgroud)

要么

name_1.23.ps
Run Code Online (Sandbox Code Playgroud)

我想最后摘下随机文件扩展名,只剩下

name_1.23.ps
Run Code Online (Sandbox Code Playgroud)

与此类似的其他问题使用'。'。作为Delimator,但这会删除name_1之后的所有内容。

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

Ken*_*ent 5

检查是否符合您的要求:

sed

sed 's/\.[^.]*$//'
Run Code Online (Sandbox Code Playgroud)

grep

grep -Po '.*(?=\.)'
Run Code Online (Sandbox Code Playgroud)

测试:

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
Run Code Online (Sandbox Code Playgroud)

从评论中编辑。我觉得这是新要求:

grep

kent$  grep -o '.*\.ps' f                                                                                         
name_1.23.ps
name_1.23.ps
name_1.23.ps
name_1.23.ps
Run Code Online (Sandbox Code Playgroud)

sed

kent$  sed 's/\(.*\.ps\)\..*/\1/' f
name_1.23.ps
name_1.23.ps
name_1.23.ps
name_1.23.ps
Run Code Online (Sandbox Code Playgroud)


小智 5

我们可以使用bash字符串操作,从字符串的后面删除最短匹配的glob模式。我们将使用“。*”作为glob模式。

filename="name_1.23.ps.png"                                                      
echo ${filename%.*}                                                              
# the above output name_1.23.ps
Run Code Online (Sandbox Code Playgroud)

我再次返回此页面时,此答案仅供我参考。(如果仅以'.ps'结尾,它不满足OP保持原始字符串相同的附加要求)。

  • 这正是我要找的! (2认同)