如何使用sed修改package文件指定行的动态版本号?
用sed动态修改NuGet包配置文件的指定版本号
核心思路
不要依赖固定行号(行号可能随文件内容变动失效),直接通过package id精准定位目标行,替换动态变化的版本号。脚本接收两个参数,分别对应OdicoGeometryOps和VSDaVinci的目标版本。
实现脚本
创建一个shell脚本(比如update-package-versions.sh),内容如下:
#!/bin/bash # 检查参数是否齐全 if [ $# -ne 2 ]; then echo "用法: $0 <OdicoGeometryOps目标版本> <VSDaVinci目标版本>" exit 1 fi # 定义目标配置文件路径(可根据实际路径修改) PACKAGE_FILE="packages.config" # 使用sed修改指定包的版本号 sed -i.bak \ -e '/id="OdicoGeometryOps"/s/version="[^"]*"/version="'$1'"/' \ -e '/id="VSDaVinci"/s/version="[^"]*"/version="'$2'"/' \ "$PACKAGE_FILE" # 可选:删除备份文件(如果不需要保留原文件备份,取消下面注释) # rm "$PACKAGE_FILE.bak" echo "版本更新完成!"
关键命令解析
-i.bak:直接修改目标文件,同时生成.bak后缀的备份文件(避免误操作丢失原内容)/id="OdicoGeometryOps"/:精准匹配包含指定package id的行,比依赖行号更稳定s/version="[^"]*"/version="'$1'"/:将该行中version="..."的内容替换为传入的第一个参数($1),[^"]*能匹配任意非双引号字符,覆盖所有动态版本号格式
使用方法
- 给脚本添加执行权限:
chmod +x update-package-versions.sh
- 运行脚本并传入目标版本:
./update-package-versions.sh "1.0.0-20240520-100000" "2.1.0"
跨平台注意事项
如果是BSD sed(比如macOS系统),-i参数语法略有不同,需调整为:
sed -i '' \ -e '/id="OdicoGeometryOps"/s/version="[^"]*"/version="'$1'"/' \ -e '/id="VSDaVinci"/s/version="[^"]*"/version="'$2'"/' \ "$PACKAGE_FILE"
内容的提问来源于stack exchange,提问作者Ashwin Nambiar
相关产品推荐
相关产品推荐

