Github Action中sed命令替换时如何保留引号?
解决sed替换setup.py版本号时丢失引号的问题
问题核心是你在Github Action中使用sed时,因引号转义或变量展开的问题,导致替换后版本号的双引号被移除。以下是几种可靠的解决方法:
方法一:修正sed命令的引号拼接
最直接的方式是用单引号包裹sed的正则表达式部分,在需要插入新版本号的位置,通过'"$NEW_VERSION"'的方式拼接变量,确保双引号被保留:
sed -i -E 's/version="[^"]*",/version="'"$NEW_VERSION"'",/' setup.py
-E启用扩展正则,[^"]*匹配引号内任意非引号字符(即原版本号)- 单引号包裹sed脚本避免shell解析内部内容,
'"$NEW_VERSION"'实现「跳出单引号→插入变量→回到单引号」的效果,让新版本号被双引号包裹
如果习惯用基础正则(不用-E),可以写成:
sed -i 's/version="\([^"]*\)",/version="'"$NEW_VERSION"'",/' setup.py
方法二:用awk替代sed(避开引号转义问题)
如果觉得sed的引号处理太麻烦,用awk可以更直观地保留引号:
awk -v new_ver="$NEW_VERSION" '/version="/{sub(/"[0-9.]*"/,"\""new_ver"\"")}1' setup.py > temp.py && mv temp.py setup.py
-v new_ver="$NEW_VERSION"将环境变量传入awk- 匹配包含
version="的行,替换引号内的版本号为带双引号的新版本号 - 最后通过临时文件重写setup.py(awk无法直接原地修改文件)
Github Action中的完整示例
把修正后的命令放到你的任务里,确保环境变量正确传递:
jobs: update_version_numbers: runs-on: ubuntu-latest needs: [build_release_notes, build_artifacts] steps: - name: 检出代码 uses: actions/checkout@v4 - name: 更新setup.py版本号 run: | sed -i -E 's/version="[^"]*",/version="'"$NEW_VERSION"'",/' setup.py env: NEW_VERSION: ${{ steps.build_release_notes.outputs.new_version }}
内容的提问来源于stack exchange,提问作者Elie
相关产品推荐
相关产品推荐

