You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本使用sed命令从tar.gz文件名提取文件夹名写法错误如何修正

Shell文件名提取问题解答

原命令错误原因

你的命令存在3个核心问题:

  • 正则中的.没有转义,正则里.默认匹配任意单个字符,不是匹配字面量的英文句号
  • 匹配规则.[0-9]*[a-z]*[0-9]* 逻辑有问题:你要求数字在前、字母在后、数字再后,无法匹配.x86_64整段,只能匹配到末尾的.64,最终只删除了.64.tar.gz,所以输出结果残留了.x86
  • 第二个sed命令s//$//为空匹配规则,属于冗余无效代码

修正方案

方案1:修正sed命令

调整正则匹配逻辑,直接匹配末尾的.x86_64.tar.gz整段删除即可:

package_folder=$(echo TEST-5.3.0.0-build1.x86_64.tar.gz | sed -E 's/\.[^.]*\.[^.]*\.tar\.gz$//')

逻辑说明:\.[^.]*\.[^.]*\.tar\.gz$ 会匹配文件名末尾连续3个点加后缀的部分(也就是.x86_64.tar.gz),替换为空后就得到目标文件名。

方案2:用Shell原生参数扩展(更高效,无需调用外部命令)

如果你的脚本运行在支持Bash/Zsh等常见Shell的环境,直接用内置的后缀删除功能即可,不需要开子进程调用sed:

filename="TEST-5.3.0.0-build1.x86_64.tar.gz"
# 先删除.tar.gz后缀
temp=${filename%.tar.gz}
# 再删除最后两级后缀(即.x86_64)
package_folder=${temp%.*.*}

两种方案执行后echo $package_folder的输出均为TEST-5.3.0.0-build1,符合预期。

内容的提问来源于stack exchange,提问作者CrazyCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:45:02