如何用Sed正则处理YAML行注释/取消注释并保留缩进?
Sed处理YAML注释时保留缩进的解决方案
原始YAML结构
parent: A: name: foo value: x.y.z # check=something # value: "yay" # check=nothing B: name: bar value: p.q.r # check=something # value: "yay" # check=nothing
场景1:取消所有含check=nothing行的注释
你之前尝试的正则(疑似笔误,目标应为check=nothing)无法保留缩进,核心问题是没有精准捕获并保留行首的缩进内容。
正确Sed命令
sed '/check=nothing/s/^\([ \t]*\)# /\1/' input.yaml
逻辑解析
^\([ \t]*\):捕获行首所有连续的空格或制表符,存入分组1,这部分就是要保留的缩进#:匹配注释符号加后续空格- 替换为
\1:仅保留原有缩进,移除注释符号部分,确保内容位置和缩进完全不变
场景2:注释所有含check=something的行
你之前的正则存在缩进异常或重复注释的问题,原因是没有区分缩进和内容区域,直接粗暴添加注释符号。
基础版(仅处理未注释的行)
sed '/check=something/ s/^\([ \t]*\)\([^#]\)/\1# \2/' input.yaml
严谨版(兼容已注释的行,避免重复加#)
sed '/check=something/ s/^\([ \t]*\)\(#\?\)\(.*\)/\1# \3/' input.yaml
逻辑解析
- 基础版:
^\([ \t]*\)捕获缩进,\([^#]\)确保目标行未被注释,在缩进和内容之间插入#,完美保留缩进位置 - 严谨版:
\(#\?\)匹配0个或1个已存在的注释符号,替换时统一为单个#加内容,既保留缩进,又避免重复注释
内容的提问来源于stack exchange,提问作者user1452759
相关产品推荐
相关产品推荐

