如何使用Mike Farah yq v4 eval原地追加YAML details键
yq v4 原地修改YAML文件的实现方法
你使用的Mike Farah开发的yq v4(4.5.1版本)已经重构了旧版的命令体系,旧版独立的write命令已整合进eval(简写为e)子命令,原地修改参数仍为-i,无需像旧版那样逐次调用命令反复写入,可一次性完成完整结构的追加操作。
一次性写入完整details列表(推荐方案)
直接通过赋值表达式写入完整列表结构,单条命令完成全部修改,不会破坏原有文件的键顺序和内容:
./bin/yq e -i '.details = [ {"name": "banana", "color": "yellow"}, {"name": "apple", "color": "red"} ]' file.yaml
执行后生成的文件结构和你预期的效果基本一致——需要注意的是,你列出的预期结构中将原有的some_dummy_key键误拼写为somme_dummy_key,上述命令不会修改原有键的拼写,与原文件内容完全保持一致。
逐次追加列表条目(兼容旧版操作逻辑)
如果需要分步写入列表内容,和旧版的逐条操作习惯对齐,可使用以下命令分步执行:
- 初始化第一个列表条目,单条命令完成两个字段的赋值
./bin/yq e -i '.details[0].name = "banana" | .details[0].color = "yellow"' file.yaml - 追加第二个列表条目到列表末尾
./bin/yq e -i '.details += [{"name": "apple", "color": "red"}]' file.yaml
关键语法说明
- v4版本无需提前初始化空的
details列表,直接对不存在的索引位置赋值时,yq会自动补全中间缺失的空结构 - 使用
+=操作符追加列表内容时,会自动将新内容合并到现有列表的末尾,不会覆盖已有的列表项 - 单条命令中可通过管道符串联多个赋值操作,减少重复读写文件的开销
新旧版本命令对应参考
旧版命令yq write -i file.yaml details.[0].name banana,在v4中等价于yq e -i '.details[0].name = "banana"' file.yaml
内容的提问来源于stack exchange,提问作者Manasa Reddy Bethi
相关产品推荐
相关产品推荐

