Jq “中的可选元素”;“减少投入”;条款

Jq “中的可选元素”;“减少投入”;条款,jq,Jq,我正在研究从前面的一个问题中得到的结果 以下是我目前拥有的: function data { cat <<EOF Security:ClientId=123456 Security:ClientSecret=abcdefg AppSettings:Environment=Dev AnotherCustomSetting=SomethingElse EOF } data | jq -nR ' def parse: capture("(?:(?<group>[^

我正在研究从前面的一个问题中得到的结果

以下是我目前拥有的:

function data {
cat <<EOF
Security:ClientId=123456
Security:ClientSecret=abcdefg
AppSettings:Environment=Dev
AnotherCustomSetting=SomethingElse
EOF
}

data | jq -nR '

def parse: capture("(?:(?<group>[^:=]*):)?(?<property>[^=]*)=(?<value>.*)");

reduce inputs as $line ({};
   ($line | parse) as $envVar
   | if .[$envVar.group] != null then .[$envVar.group][$envVar.property] = ($envVar.value) else .[$envVar.property] = ($envVar.value) end)
'
在我的上一个问题中,我没有指出我需要根级别的属性(
AnotherCustomSetting

为了使根级属性正常工作,我修改了RegEx,使其具有一个可选的组,但是原始答案的
reduce inputs
没有预料到
为空(并且在设置时出现了空错误)。因此我尝试在
reduceinputs
部分中放入
if
语句。不幸的是,它失败了,出现以下错误:

jq:错误(位于:4):无法为空对象编制索引

是否可以像我正在尝试的那样,在
减少输入
部分执行
if-then-else
?如果是这样的话,是如何做到的?

这应该可以做到:

def parse: capture("(?<x>[^:=]*)(:(?<y>[^:=]*))?=(?<value>.*)");

reduce inputs as $line ({};
   ($line | parse) as $p
   | if $p.y then .[$p.x][$p.y] = $p.value
     else .[$p.x] = $p.value end )
def parse:capture((?[^:=]*)(:(?[^:=]*))?=(?*);
将输入减少为$行({});
($line | parse)作为$p
|如果为$p.y,则为[$p.x][$p.y]=$p.value
else。[$p.x]=$p.value end)

当然,这可以进一步证实…

再次感谢您!非常感谢你抽出时间回答我的问题。
def parse: capture("(?<x>[^:=]*)(:(?<y>[^:=]*))?=(?<value>.*)");

reduce inputs as $line ({};
   ($line | parse) as $p
   | if $p.y then .[$p.x][$p.y] = $p.value
     else .[$p.x] = $p.value end )