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

如何用sed精准替换yaml.j2中嵌套的指定myid值

用sed精准替换group1下jerry的myid值

针对你遇到的两个问题,这里提供一个精准匹配的sed命令,确保只修改group1分组下名称完全匹配jerry的用户的myid:

假设你的yaml.j2结构类似:

groups:
  - name: group1
    users:
      - name: jerry
        myid: 123
      - name: jamesjerry
        myid: 456
  - name: group2
    users:
      - name: jerry
        myid: 789

执行替换的sed命令:

sed -E '/^[[:space:]]*- name: group1$/,/^[[:space:]]*- name:/ {
  /^[[:space:]]*name: jerry$/ {
    :update_myid
    n
    /^[[:space:]]*myid:/ s/([[:space:]]*myid: ).*/\1999/
    /^[[:space:]]*name:/ b exit_loop
    b update_myid
    :exit_loop
  }
}' yaml.j2

命令解释:

  1. 限定group1区间:/^[[:space:]]*- name: group1$/,/^[[:space:]]*- name:/ 精准定位到group1的分组范围,只在这个区间内执行后续操作,不会影响其他分组的内容。
  2. 精确匹配jerry:/^[[:space:]]*name: jerry$/ 用$确保行尾是jerry,避免匹配jamesjerry这类包含jerry的名称。
  3. 替换myid:进入update_myid循环后,逐行读取内容,找到myid:行时替换值(示例中替换为999),遇到下一个用户的name:行时退出循环,避免修改当前用户条目外的内容。

直接修改文件(原地替换):

如果需要直接修改原文件,添加-i参数(Linux下用-i,macOS下用-i ''):

# Linux
sed -i -E '/^[[:space:]]*- name: group1$/,/^[[:space:]]*- name:/ {
  /^[[:space:]]*name: jerry$/ {
    :update_myid
    n
    /^[[:space:]]*myid:/ s/([[:space:]]*myid: ).*/\1999/
    /^[[:space:]]*name:/ b exit_loop
    b update_myid
    :exit_loop
  }
}' yaml.j2

# macOS
sed -i '' -E '/^[[:space:]]*- name: group1$/,/^[[:space:]]*- name:/ {
  /^[[:space:]]*name: jerry$/ {
    :update_myid
    n
    /^[[:space:]]*myid:/ s/([[:space:]]*myid: ).*/\1999/
    /^[[:space:]]*name:/ b exit_loop
    b update_myid
    :exit_loop
  }
}' yaml.j2

内容的提问来源于stack exchange,提问作者arizona525

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:43:18