在GitHub Actions合并PR后,用sed精准替换文件中的分支名为main
解决GitHub Actions中PR合并后替换笔记本文件分支名为main的问题
问题场景
将PR合并到main分支后,需要批量替换笔记本文件中的PR源分支名为main,但现有sed正则会误替换分支名后的所有内容,同时GITHUB_REF_NAME无法获取PR源分支名,仅指向main分支。
错误示例
- 对于行
git clone --branch fork1 https://somrepo.git,原正则sed -i 's/\(--branch\)\(.*\)/\1 main/'会把fork1 https://somrepo.git全部替换为main,破坏原命令结构 - 对于行
"https://colab.research.google.com/github/user/repo/blob/fork2/notebook.ipynb",原正则sed -i 's/\(blob\/\)\(.*\)/\1 main\//'会把fork2/notebook.ipynb全部替换为main/,丢失文件路径
正确的sed替换方案
1. 处理git clone分支行
利用分支名的字符范围(字母、数字、下划线、短横线)精准匹配,仅替换分支名:
sed -i 's/\(--branch \)[a-zA-Z0-9_-]\+/\1 main/' filename.ipynb
- 匹配逻辑:
\(--branch \)捕获固定前缀,[a-zA-Z0-9_-]\+精准匹配分支名,替换后保留前缀并将分支名改为main
2. 处理Colab链接行
同样精准匹配blob/后的分支名,不影响后续路径:
sed -i 's/\(blob\/\)[a-zA-Z0-9_-]\+/\1 main/' filename.ipynb
- 匹配逻辑:
\(blob\/\)捕获固定前缀,[a-zA-Z0-9_-]\+精准匹配分支名,替换后保留前缀并将分支名改为main
修改后的GitHub Action配置
将原有步骤中的sed命令替换为上述精准匹配命令,支持批量处理所有.ipynb文件:
name: Update Branch Name on: push: branches: - main jobs: restore_main_branch_name: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Update .ipynb files run: | # 替换git clone语句中的分支名 sed -i 's/\(--branch \)[a-zA-Z0-9_-]\+/\1 main/' *.ipynb # 替换Colab链接中的分支名 sed -i 's/\(blob\/\)[a-zA-Z0-9_-]\+/\1 main/' *.ipynb - name: Commit changes run: | git config --local user.email "actions@github.com" git config --local user.name "GitHub Actions" git commit -am "Restore main branch name in .ipynb files" git push -u origin main
- 若只需处理特定文件,将
*.ipynb替换为具体文件名(如colabLaunchScript.ipynb)即可
内容的提问来源于stack exchange,提问作者Ali J. Ghandour
相关产品推荐
相关产品推荐

