MacOS下使用sed和grep的Bash脚本报错,请求修复
修复macOS下Flutter版本号递增脚本
原脚本问题分析
你的脚本触发两个错误:
- grep错误:macOS自带BSD grep,不支持
(?<=...)正向预查语法,导致正则解析失败。 - sed错误:BSD sed默认使用基础正则,捕获组需用
\(...\)而非(...);且你原替换逻辑错误(将build号替换为补丁号片段,未实现递增),同时未启用扩展正则模式。
修复后的完整脚本
#!/bin/bash # 读取pubspec.yaml中的版本号(兼容macOS BSD工具链) version=$(grep 'version:' pubspec.yaml | awk '{print $2}') # 拆分版本号各组成部分:主版本、次版本、补丁号、Build号 IFS='.-+' read -r major minor patch _ build <<< "$version" # 递增补丁号与Build号 new_patch=$((patch + 1)) new_build=$((build + 1)) # 拼接生成新版本号 new_version="${major}.${minor}.${new_patch}-alpha+${new_build}" # 原地替换pubspec.yaml中的版本号(BSD sed语法) sed -i '' "s/version:.*/version: ${new_version}/" pubspec.yaml
关键修复点说明
- 替换grep逻辑:改用
grep + awk组合提取版本号,避开BSD grep的预查限制,更稳定可靠。 - 版本号拆分:通过
IFS设置分隔符,将0.2.6-alpha+26拆分为major=0、minor=2、patch=6、build=26,便于单独修改。 - 递增实现:直接用算术运算
$((...))对数字字段+1,比正则替换更直观,避免正则匹配失误。 - 适配BSD sed:macOS的sed需用
-i ''实现原地替换(空字符串表示不生成备份文件),替换正则精准匹配版本号行。
测试效果
原版本行:
version: 0.2.6-alpha+26
运行脚本后将变为:
version: 0.2.7-alpha+27
内容的提问来源于stack exchange,提问作者xetra11
相关产品推荐
相关产品推荐

