如何用Linux sed替换YAML文件数组末尾元素且不破坏缩进
用sed实现YAML特定行数组末尾元素替换
核心命令
假设你要把目标行数组的最后一个元素改成10,直接用这条sed命令即可:
sed -E '/^[[:space:]]*variable: / s/([[:space:]]*,[[:space:]]*)([0-9]+(\.[0-9]+)?)([[:space:]]*]$)/\110\4/' your_file.yaml
命令逻辑拆解
/^[[:space:]]*variable: /:专门定位目标行——不管行前有多少空格/制表符缩进,只要是以variable:开头的行,才会被处理,完全不碰其他行- 替换部分的正则精准锁定要修改的位置:
- 先捕获最后一个元素前的逗号和前后可能的空格(比如
,或者,),这部分原封不动保留 - 再捕获要替换的数字(支持整数如
3、浮点数如4.2),直接换成你需要的10 - 最后捕获数字后的空格和数组结尾的
],这部分也原封不动保留,确保缩进和原有格式完全不变
- 先捕获最后一个元素前的逗号和前后可能的空格(比如
实际效果示例
如果原行是:
variable: [1, 2, 3]
执行命令后会变成:
variable: [1, 2, 10]
如果原行有浮点数和不规则空格:
variable: [ 0.5, 1.8 , 4.2 ]
执行后会变成:
variable: [ 0.5, 1.8 , 10 ]
直接修改原文件(谨慎操作)
如果要直接修改原文件,记得先备份,然后加上-i参数:
sed -i -E '/^[[:space:]]*variable: / s/([[:space:]]*,[[:space:]]*)([0-9]+(\.[0-9]+)?)([[:space:]]*]$)/\110\4/' your_file.yaml
内容的提问来源于stack exchange,提问作者Josh.h
相关产品推荐
相关产品推荐

