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
相关产品推荐
相关产品推荐

