select - 如何使用 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.github.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
}
}
推荐阅读
- android - 禁用未通过代码应用的滑动动画
- javascript - 收到请求后 JS 重定向
- haskell - 是否有“双重”变焦?
- python-3.x - 从 HashingVectorizer 中检索词汇
- c# - EPPlus - ExcelPackage 从 Stream/FileInfo 加载多张工作表会生成一个没有数据的 excel 文档
- android - Kotlin、RxJava、Retrofit2 调用 API 但返回 2 个不同的 JSON 问题
- c# - Html 邮件不起作用
- spring - 如何将 Kongs X-Forwarded-Prefix Header 放入 Spring Boot 应用程序及其 HATEOAS 链接?
- bash - 使用列表中的名称复制文件
- java - 使用几乎完全重复的代码但对其他方法的不同调用来重构函数