如何使用sed在Azure DevOps Pipeline的qa阶段指定行范围替换字符串
使用sed在Azure DevOps Pipeline的QA阶段指定行范围内修改内容
问题背景
我有多个包含多阶段(如QA、UAT)的Azure DevOps Pipeline文件,需要对QA阶段做两处修改:
- 把
dependsOn的依赖从dev改成build(这部分已经用sed搞定了) - 把
condition里的分支refs/heads/development替换成refs/heads/main
要求UAT阶段完全不动,但condition所在的行数不固定,没法用固定行数跳转,想让sed只在stage:'qa'出现后的第4到10行里执行替换操作。
解决方案
可以用sed的分支循环+计数逻辑实现精准范围替换,只会在stage:'qa'行之后的第4-10行内修改目标字符串,碰到下一个阶段定义就自动停止,不会影响其他阶段。
单行sed命令
sed '/stage:'\''qa'\''/{n;n;n;:loop;s/refs\/heads\/development/refs\/heads\/main/;n;/stage:/!{x;s/^$/0/;/^6$/!{s/$/+1/;x;b loop};x}}}' your-pipeline.yml
命令拆解
- 匹配QA阶段起始行:
/stage:'qa'/{ ... }—— 只有匹配到stage:'qa'的行时,才执行后续逻辑 - 跳过前3行:
n;n;n—— 跳过QA阶段起始行之后的前3行,从第4行开始处理 - 循环处理目标行:
:loop定义循环标记,每次先执行替换,再读取下一行 - 计数控制范围:用保持空间存储计数,处理满7行(第4到第10行)后自动退出循环;如果中途碰到新的
stage:定义(比如UAT阶段),也会直接停止,避免越界修改
验证修改结果
执行命令后,用以下命令检查QA阶段的修改是否生效:
grep -A 15 "stage:'qa'" your-pipeline.yml
确认condition中的分支已替换为refs/heads/main,同时检查UAT阶段内容无变化。
内容的提问来源于stack exchange,提问作者Kostrahb
相关产品推荐
相关产品推荐

