【发布时间】:2018-05-20 15:35:28
【问题描述】:
使用 Bash 和 jq,如果我有一个 .<key1>.<key2>...<keyN> 形式的 Bash 变量过滤器 F 并且我想切片一个 Bash 变量 JSON 对象 O 以便结果只是对象的那一部分,包括 F 中的所有键,如何使用 jq 来完成?
例如,假设:
O='
{
"a":
{
"b":
{
"c": { "p":1 },
"x": 1
},
"x": 2
},
"x": 3
}'
然后,做:
F='.a.b.c'; jq -r "$F" <<<"$O"
结果:
{
"p": 1
}
但是,我希望切片包含父键层次结构。
不优雅的解决方案
我想出了一个解决方案,但它涉及对 jq 的 2 次调用:
F='.a.b.c'; S="$(jq -r "$F" <<<"$O"); jq --null-input -r "$F |= $S"
结果:
{
"a": {
"b": {
"c": {
"p": 1
}
}
}
}
该解决方案必须适用于 任何 有效的 O 和 F Bash 变量,其中 O 存储一个 JSON 对象,而 F 是一个简单的键名过滤器,仅如上所述。例如:
F='.a.b'; S="$(jq -r "$F" <<<"$O")"; jq --null-input -r "$F |= $S"
结果:
{
"a": {
"b": {
"c": {
"p": 1
},
"x": 1
}
}
}
在 jq 中可以更简单地使用 key-hierarchy 过滤器对对象进行切片吗?
【问题讨论】: