如何用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
命令解释:
- 限定group1区间:
/^[[:space:]]*- name: group1$/,/^[[:space:]]*- name:/精准定位到group1的分组范围,只在这个区间内执行后续操作,不会影响其他分组的内容。 - 精确匹配jerry:
/^[[:space:]]*name: jerry$/用$确保行尾是jerry,避免匹配jamesjerry这类包含jerry的名称。 - 替换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
相关产品推荐
相关产品推荐

