JQ 检查作为参数给出的数组中的值
JQ checking for values in an array given as a parameter
我有一个简单的 JQ 过滤器可以根据“键”更新数组中的一些值,例如这是我的输入:
[
{
"Key": "IDontCare",
"Value": "something"
},
{
"Key": "Tag1",
"Value": "123-456"
},
{
"Key": "Tag2",
"Value": "121-717"
}
]
我想将两个标签都更新为一个新值(两者的值相同),所以我得到了这个有效的命令:
jq --arg NEW_VALUE '987-654' \
'[.[] |= if(.Key=="Tag1" or .Key=="Tag2") then (.Value=$NEW_VALUE) else . end]'
但是我想在不同的运行中更新不同的标签,并想将它们作为另一个参数传递。但不确定如何更改 if()
以从参数中查找标签。
我试过类似的方法,但这显然不是正确的方法:
jq --argjson TAGS '["Tag1","Tag2"]' --arg NEW_VALUE '987-654' \
'[.[] |= if(.Key|in($TAGS)) then (.Value=$NEW_VALUE) else . end]'
有什么想法吗?
您可以使用 IN
查看该值是否是列表的一部分,并使用 select as
使用更简单的更新分配
jq --arg NEW_VALUE '987-654' --argjson TAGS '["Tag1","Tag2"]' '
map(select( .Key | IN($TAGS[] ) ).Value |= $NEW_VALUE )' json
使用 jq 1.5 或更高版本
jq --arg NEW_VALUE '987-654' --argjson TAGS '["Tag1","Tag2"]' '
def IN(s): first((s == .) // empty) // false;
map(if .Key | IN($TAGS[]) then .Value = $NEW_VALUE else . end)
'
(使用 jq 1.6,显然可以省略 IN/1
的 def。)
使用 jq 1.4 或更高版本
jq --arg NEW_VALUE '987-654' --arg TAGS '["Tag1","Tag2"]' '
($TAGS|fromjson) as $TAGS
| map(if [.Key == $TAGS[]]|any then .Value = $NEW_VALUE else . end)
'
我有一个简单的 JQ 过滤器可以根据“键”更新数组中的一些值,例如这是我的输入:
[
{
"Key": "IDontCare",
"Value": "something"
},
{
"Key": "Tag1",
"Value": "123-456"
},
{
"Key": "Tag2",
"Value": "121-717"
}
]
我想将两个标签都更新为一个新值(两者的值相同),所以我得到了这个有效的命令:
jq --arg NEW_VALUE '987-654' \
'[.[] |= if(.Key=="Tag1" or .Key=="Tag2") then (.Value=$NEW_VALUE) else . end]'
但是我想在不同的运行中更新不同的标签,并想将它们作为另一个参数传递。但不确定如何更改 if()
以从参数中查找标签。
我试过类似的方法,但这显然不是正确的方法:
jq --argjson TAGS '["Tag1","Tag2"]' --arg NEW_VALUE '987-654' \
'[.[] |= if(.Key|in($TAGS)) then (.Value=$NEW_VALUE) else . end]'
有什么想法吗?
您可以使用 IN
查看该值是否是列表的一部分,并使用 select as
jq --arg NEW_VALUE '987-654' --argjson TAGS '["Tag1","Tag2"]' '
map(select( .Key | IN($TAGS[] ) ).Value |= $NEW_VALUE )' json
使用 jq 1.5 或更高版本
jq --arg NEW_VALUE '987-654' --argjson TAGS '["Tag1","Tag2"]' '
def IN(s): first((s == .) // empty) // false;
map(if .Key | IN($TAGS[]) then .Value = $NEW_VALUE else . end)
'
(使用 jq 1.6,显然可以省略 IN/1
的 def。)
使用 jq 1.4 或更高版本
jq --arg NEW_VALUE '987-654' --arg TAGS '["Tag1","Tag2"]' '
($TAGS|fromjson) as $TAGS
| map(if [.Key == $TAGS[]]|any then .Value = $NEW_VALUE else . end)
'