如何用单条shell命令实现字符串删前缀与替换后缀操作
为什么嵌套写法报错
Shell 的参数扩展语法不支持嵌套结构,${} 内部只能跟变量名,不能是另一个参数扩展的结果,因此你写的 ${${$newfile#*/}::-4}.gz 属于非法语法,必然会抛出 bad substitution 错误。
单条命令实现方案
下面给出几种常用实现方式:
1. 调用basename工具(最简洁易读,兼容所有POSIX shell)
basename 本身就自带去除目录前缀、指定去除后缀的能力,直接写:
newfile=$(basename "$newfile" .txt).gz
如果后缀长度不固定,只想把任意后缀换成.gz,可以调整为:
newfile=$(basename "${newfile%.*}").gz
2. 纯Bash内置实现(无外部进程调用,性能更高)
用正则匹配捕获目标文件名,不需要调用外部工具:
[[ $newfile =~ ([^/]+)\.txt$ ]] && newfile=${BASH_REMATCH[1]}.gz
3. sed流处理实现
适合需要做更复杂字符串加工的场景:
newfile=$(sed 's#.*/\(.*\)\.txt#\1.gz#' <<< "$newfile")
内容的提问来源于stack exchange,提问作者Lucas Rey
相关产品推荐
相关产品推荐

