3

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

name_1.23.ps.png

或者

name_1.23.ps.best

或者

name_1.23.ps

我想在最后去掉随机文件扩展名,只剩下

name_1.23.ps

与此类似的其他问题使用“。” 作为分隔符,但这会删除 name_1 之后的所有内容。

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

4

3 回答 3

8

检查它是否适合您的要求:

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
于 2013-08-15T11:06:04.030 回答
8

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

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

当我几次回到这个页面时,这个答案更多地供我自己参考。(如果它仅以“.ps”结尾,则它不满足 OP 保持原始字符串相同的附加要求)。

于 2016-11-15T23:30:45.950 回答
-1

尝试这个:

string="name_1.23.ps.png"
array=(${string//./ })
echo "${array[0]}.${array[1]}.${array[2]}"
于 2013-08-15T10:55:48.903 回答