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

Bash脚本需求:将数字前最后一个连字符替换为@符号

解决Bash脚本中替换第一个数字前最后一个连字符为@的需求

先明确你的目标转换效果:

  • reactframework-client-1.2.3-98765-demo → reactframework-client@1.2.3-98765-demo
  • react-example/service-3.2.1-98765-demo → react-example/service@3.2.1-98765-demo
  • react-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

额外修正说明

  1. 原脚本中${package:2:4}是错误的字符截取逻辑,改用${package%.zip}和${package#./}更稳妥地处理文件名前缀后缀
  2. 循环引用数组元素时用"${arr[@]}",避免文件名含空格时出现异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:55:23