jq select 过滤器的意外操作
Unexpected action of jq select filter
我使用 jq 已经有一段时间了,但今天的一些行为让我感到惊讶:
我预计会这样:
echo '{"Name":"NAME","Tags":[{"Key":"KEY","Value":"HASH"}]}' \
| jq '{"name": .Name, "hash": (.Tags[]|select(.Key=="hash")|.Value)}'
制作这个:
{
"name": "NAME",
"hash": null
}
而是从输出中完全过滤掉整个对象。
作为完整性检查,将过滤器更改为匹配如下的值::
echo '{"Name":"NAME","Tags":[{"Key":"KEY","Value":"HASH"}]}' \
| jq '{"name": .Name, "hash": (.Tags[]|select(.Key=="KEY")|.Value)}'
产生预期的输出:
{
"name": "NAME",
"hash": "HASH"
}
第一种情况 select(.Key=="hash")
的输出令我感到惊讶,因为 select 过滤器旨在作用于 .Tags[] 产生的流而不是整个输入流.
如何表达我想表达的意思,就是如果没有匹配的Tag,输出对象的“hash”属性应该设置为null?
我在 OSX
上使用 jq 1.6
如果过滤器的一部分产生 empty
,它会吸取所有与之相关的东西。
解决方法:不要让它产生empty
。一种方法是给 select
过滤器一个替代方案:select(.Key=="hash") // null
jq '{"name": .Name, "hash": (.Tags[] | select(.Key=="hash") // null | .Value)}'
{
"name": "NAME",
"hash": null
}
我使用 jq 已经有一段时间了,但今天的一些行为让我感到惊讶:
我预计会这样:
echo '{"Name":"NAME","Tags":[{"Key":"KEY","Value":"HASH"}]}' \
| jq '{"name": .Name, "hash": (.Tags[]|select(.Key=="hash")|.Value)}'
制作这个:
{
"name": "NAME",
"hash": null
}
而是从输出中完全过滤掉整个对象。
作为完整性检查,将过滤器更改为匹配如下的值::
echo '{"Name":"NAME","Tags":[{"Key":"KEY","Value":"HASH"}]}' \
| jq '{"name": .Name, "hash": (.Tags[]|select(.Key=="KEY")|.Value)}'
产生预期的输出:
{
"name": "NAME",
"hash": "HASH"
}
第一种情况 select(.Key=="hash")
的输出令我感到惊讶,因为 select 过滤器旨在作用于 .Tags[] 产生的流而不是整个输入流.
如何表达我想表达的意思,就是如果没有匹配的Tag,输出对象的“hash”属性应该设置为null?
我在 OSX
上使用 jq 1.6如果过滤器的一部分产生 empty
,它会吸取所有与之相关的东西。
解决方法:不要让它产生empty
。一种方法是给 select
过滤器一个替代方案:select(.Key=="hash") // null
jq '{"name": .Name, "hash": (.Tags[] | select(.Key=="hash") // null | .Value)}'
{
"name": "NAME",
"hash": null
}