Json 使用jq将x=y对转换为键/值对

Json 使用jq将x=y对转换为键/值对,json,parsing,key,environment-variables,jq,Json,Parsing,Key,Environment Variables,Jq,我试图从docker inspect的JSON输出中解析环境变量。令人烦恼的是,这些环境变量没有作为有用的键值对返回。它们只是x=y字符串的数组。以下是输出的相关片段: [ { “配置”:{ “环境”:[ “JENKINS_主机=1.2.3.4”, “JENKINS_实例=茶”, “JENKINS_NAME=企业架构工具”, “JENKINS_版本=2.46.2”, “JENKINS_协议=http” ] } } ] 我想将该数组转换为如下内容: { “配置”:{ “环境”:{ “JENKIN

我试图从docker inspect的JSON输出中解析环境变量。令人烦恼的是,这些环境变量没有作为有用的键值对返回。它们只是x=y字符串的数组。以下是输出的相关片段:

[
{
“配置”:{
“环境”:[
“JENKINS_主机=1.2.3.4”,
“JENKINS_实例=茶”,
“JENKINS_NAME=企业架构工具”,
“JENKINS_版本=2.46.2”,
“JENKINS_协议=http”
]
}
}
]
我想将该数组转换为如下内容:

{
“配置”:{
“环境”:{
“JENKINS_主持人”:“1.2.3.4”,
“JENKINS_实例”:“茶”,
“JENKINS_NAME”:“企业架构工具”,
“JENKINS_版本”:“2.46.2”,
“JENKINS_协议”:“http”
}
}
}
这样,我就可以使用像
jq.[].\Config.Env.JENKINS\u HOST'
这样的命令来获取我关心的值。我想不出怎样才能做到这一点

选择数据甚至将键和值拆分为单独的元素相对容易。例如,如果我使用
jq.[]|.Config.Env.[]| split(“=”)
,我会得到如下数据:

[
“JENKINS_主持人”,
"1.2.3.4"
]
[
“JENKINS_实例”,
“茶”
]
[
“詹金斯的名字”,
“企业架构工具”
]
[
“詹金斯版本”,
"2.46.2"
]
[
“詹金斯协议”,
“http”
]

但是,我不知道如何将这些数据转换为对象赋值。似乎应该是
map
reduce
的组合,但我被难住了。有人能给我指出正确的方向吗?

要将两个字符串的数组(例如:[“k”,“v”])转换为一个对象,您可以编写:

{ (.[0]) : .[1] }
所以你会想写一些类似的东西:

 map(.Config.Env |= (map( split("=") | { (.[0]) : .[1] } ) | add))
a2o 将数组抽象为对象功能使解决方案更易于理解:

def a2o: map( split("=") | { (.[0]) : .[1] } ) | add;

map(.Config.Env |= a2o)
使用
match
capture
而不是
split
由于“=”字符可能出现在每个
var=value
字符串的“value”部分,因此天真地使用
split
可能不是一个好主意。假设jq支持正则表达式,下面是一个更健壮的替代方案:

match("([^=]*)=(.*)") | .captures | {(.[0].string) : .[1].string}
或者,更简洁、更优雅一点:

[capture( "(?<key>[^:]*):(?<value>.*)" )] | from_entries

给定要转换为单个对象的项目集合,我通常会选择使用
reduce
。将这些项转换为它们的组成键和值,然后指定给结果对象

reduce (.[] | split("=")) as [$key, $value] ({}; .[$key] = $value)
虽然在这里使用
from_entries
也很有用,但您应该创建一个它所期望的键/值对象数组

map(split("=") as [$key, $value] | {$key, $value}) | from_entries
然后使用您选择的任何方法将其与
Env
属性的更新放在一起

.[].Config.Env |= reduce (.[] | split("=")) as [$key, $value] ({}; .[$key] = $value)
#or
.[].Config.Env |= (map(split("=") as [$key, $value] | {$key, $value}) | from_entries)

好极了!这正是我想要的。简洁明了。
.[].Config.Env |= reduce (.[] | split("=")) as [$key, $value] ({}; .[$key] = $value)
#or
.[].Config.Env |= (map(split("=") as [$key, $value] | {$key, $value}) | from_entries)