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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 11:40:02