如何使用yq根据子键值选择所有YAML键



我有一个像这样的YAML文件:

$ yq '.' test.yaml
{
"entries": {
"entry1": {
"enabled": true
},
"entry2": {
"enabled": false
},
"entry3": {
"dummy": "TEST"
}
}
}

我想选择所有启用属性设置为true的条目:

$ yq '.entries | select(.[].enabled==true)' test.yaml
^  ^
|  |
|  --- with enabled attribute set to true
------ all entries

我希望输出是

{
"entry1": {
"enabled": true
}
}

但是我得到

{
"entry1": {
"enabled": true
},
"entry2": {
"enabled": false
},
"entry3": {
"dummy": "TEST"
}
}

我做错了什么?

诀窍是将对象转换为数组,将选择应用于数组元素,然后将其转换回对象。过滤器with_entries在发动机罩下进行这些转换。它是to_entries | map(foo) | from_entries的简写(请参阅jq手册(。

根据所使用的yq实现,调用略有不同:yq-Python或yq-Go。bash脚本包含对这两种实现的调用。

#!/bin/bash
INPUT='
{
"entries": {
"entry1": {
"enabled": true
},
"entry2": {
"enabled": false
},
"entry3": {
"dummy": "TEST"
}
}
}
'
echo "yq - Go implementation"       # https://mikefarah.gitbook.io/yq/
yq -j e '.entries | with_entries(select(.value.enabled == true))' - <<< "$INPUT"
echo "yq - Python implementation"   # https://github.com/kislyuk/yq
yq '.entries | with_entries(select(.value.enabled == true))' <<< "$INPUT"

输出

{
"entry1": {
"enabled": true
}
}

最新更新