我想使用 jqb
从两个可能的路径(并且仅这两个路径)获取特定值。所以,基本上,我想说
jq '(path1 OR path2) | .b'
b
如果位于两条路径之一path1
或 ,则应该有效path2
。如果两条路径都有b
,则第一条路径优先。
例如,两者
echo '{"b":2}' | jq '.b'
echo '{"a": {"b":2}}' | jq '.a.b'
提取b
于.
和.a
。
我可以说
echo ... | jq '(MAGIC).b'
使其适用于上面的两个输入?
到目前为止我尝试的是使用递归运算符..
:
jq '[..|.b?|values]|first'
这种方法的作用在于:
echo '{"b":2}' | jq '[..|.b?|values]|first'
echo '{"a": {"b":2}}' | jq '..|.b?|values|first'
给2
。但它不够具体,并且还允许b
位于下面树中的任何位置.
。它也很难阅读。另外,如果两条路径没有父子关系,则可能无法工作。
(这是 Ubuntu 24.04 LTS 中的 jq 1.7)
这将提取顶级
b
键的值,但如果该值丢失,null
, 或false
(即,如果该值在布尔上下文中为falseb
),请使用下的键a
。如果您知道您的顶级
b
键永远不会对应于布尔值,那么上面的内容将会简短而敏捷。对于更通用的方法,您需要测试密钥是否存在b
而不是测试其值:这将提取顶级
b
键的值(如果存在),否则将返回另一个键的值。如果这是该键所具有的值,则这将能够返回顶级键的false
or 。null
b
至于你的“神奇”表达,按照你要求的确切形式,即
(MAGIC).b
:在这里,该
if
语句返回 or.
,具体.a
取决于b
当前对象中是否存在该键。键b
的值是从“magic”表达式返回的任何对象中提取的。