Bash脚本需求:将数字前最后一个连字符替换为@符号
解决Bash脚本中替换第一个数字前最后一个连字符为@的需求
先明确你的目标转换效果:
reactframework-client-1.2.3-98765-demo→reactframework-client@1.2.3-98765-demoreact-example/service-3.2.1-98765-demo→react-example/service@3.2.1-98765-demoreact-docs/client-4.3.2-98765-demo→react-docs/client@4.3.2-98765-demo
核心需求是定位字符串中第一个数字出现前的最后一个-,并将其替换为@,可以用这条sed命令实现:
package=$(echo "$package" | sed 's/\(.*\)-\([0-9]\)/\1@\2/')
命令解释
\(.*\):贪婪匹配任意字符,直到找到紧跟数字的最后一个--\([0-9]\):匹配那个紧邻第一个数字的-以及该数字\1@\2:将捕获的-前内容、@、第一个数字拼接,完成替换
整合后的完整脚本
同时修正了原脚本中处理文件名的错误逻辑:
arr=( "./***framework-client-1.2.3-98765-demo.zip" "./***-example-service-3.2.1-98765-demo.zip" "./***-docs-client-4.3.2-98765-demo.zip" ) for package in "${arr[@]}" do # 移除末尾的.zip后缀 package="${package%.zip}" # 去掉开头的./前缀 package="${package#./}" # 将所有***替换为react package="${package//***//react}" if [[ $package == *reactframework* ]]; then # 替换第一个连字符为/ package=$(echo "$package" | sed 's/-/\//1') else # 替换第二个连字符为/ package=$(echo "$package" | sed 's/-/\//2') fi # 替换第一个数字前的最后一个-为@ package=$(echo "$package" | sed 's/\(.*\)-\([0-9]\)/\1@\2/') # 打印转换结果 echo "$package" done
额外修正说明
- 原脚本中
${package:2:4}是错误的字符截取逻辑,改用${package%.zip}和${package#./}更稳妥地处理文件名前缀后缀 - 循环引用数组元素时用
"${arr[@]}",避免文件名含空格时出现异常
内容的提问来源于stack exchange,提问作者jizzer
相关产品推荐
相关产品推荐

