我的文件名看起来与此类似
name_1.23.ps.png
或者
name_1.23.ps.best
或者
name_1.23.ps
我想在最后去掉随机文件扩展名,只剩下
name_1.23.ps
与此类似的其他问题使用“。” 作为分隔符,但这会删除 name_1 之后的所有内容。
我想在命令行上执行此操作(在 tcsh 或 bash 中)
检查它是否适合您的要求:
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
我们可以使用 bash 字符串操作从字符串后面删除 glob 模式的最短匹配。我们将使用“.*”作为 glob 模式。
filename="name_1.23.ps.png"
echo ${filename%.*}
# the above output name_1.23.ps
当我几次回到这个页面时,这个答案更多地供我自己参考。(如果它仅以“.ps”结尾,则它不满足 OP 保持原始字符串相同的附加要求)。
尝试这个:
string="name_1.23.ps.png"
array=(${string//./ })
echo "${array[0]}.${array[1]}.${array[2]}"