使用yq根据order.yaml自定义序列重排YAML映射失败求排查
问题原因
你忽略了pick函数的参数格式要求:在当前主流的Go语言实现版本(mikefarah/yq v4+)中,pick需要接收多个独立的键名参数,而非单个数组参数。
当你执行pick(load("order.yaml"))时,load("order.yaml")返回的是完整数组["ccc", "aaa", "bbb", "eee"],pick会将这个数组当作一个单独的键去匹配,自然找不到对应键值,所以输出空对象{}。
你提到直接传数组的命令能生效,大概率是混淆了参数格式——正确的有效写法应该是pick("ccc", "aaa", "bbb", "eee");若你使用的是基于jq的kislyuk/yq(该版本支持数组作为pick参数),则可能是load的路径或语法存在隐性问题。
解决方案
针对主流的mikefarah/yq v4+版本,只需用**展开操作符***将load返回的数组拆分为独立参数传给pick即可:
document='aaa: hello bbb: world ccc: foo ddd: bar' yq '. |= pick(*load("order.yaml"))' <<< "$document"
执行后会输出正确的排序结果:
ccc: foo aaa: hello bbb: world
如果使用的是kislyuk/yq,建议通过--argfile参数传入外部数组,避免load的语法问题:
document='aaa: hello bbb: world ccc: foo ddd: bar' yq -y 'pick($order)' --argfile order order.yaml <<< "$document"
内容的提问来源于stack exchange,提问作者the_eraser
相关产品推荐
相关产品推荐

