json 当其中一个字符串可能为空时,如何用jq连接两个字符串?

v6ylcynt  于 2022-11-19  发布在  其他
关注(0)|答案(4)|浏览(161)

我正在尝试解析AWS示例元数据,以获取两个值,并将它们组合成一个字符串(名称和ID)。名称有时是空的,而jq不想追加到null。我如何告诉jq只假设null值是空字符串?我看到过“解构”操作符或map函数来实现这一点,但我似乎无法使用任何语法。
这可能会使事情更加复杂,但是名称是作为值存储在键-值标记中的。.Tags[]|select(.Key == "Name").Value .
以下是一些示例数据:

{
  "InstanceId": "i-abc",
  "Tags": [
    {
      "Key": "Name",
      "Value": "Grafana"
    }
  ]
}
{
  "InstanceId": "i-def"
}

这是我在尝试的:

cat sample.json |jq -r '.|{together: (.InstanceId + " " + (.Tags[]|select(.Key == "Name").Value) // empty)}'
{
  "together": "i-abc Grafana"
}
jq: error (at <stdin>:12): Cannot iterate over null (null)
edqdpe6u

edqdpe6u1#

不要把事情复杂化:

  • 去掉无操作.|
  • 存取选择性属性时,请使用错误抑制运算子(?)。
  • 空字符串是"",而不是emptyempty是一个什么都不生成的生成器(效果有点混乱)。
  • 将括号添加到组表达式/定义运算符优先级。
{ together: (.InstanceId + " " + ((.Tags[]|select(.Key == "Name").Value)? // "")) }

输出量:

{
  "together": "i-abc Grafana"
}
{
  "together": "i-def "
}

如果您不想使用尾随空格,请使用0 stone 0的解决方案。

wlp8pajw

wlp8pajw2#

失败时,使用括号排除.InstanceId但包含" " + …
第一个
Demo

nxagd54h

nxagd54h3#

另一种方法是使用select()、end生成一个数组,然后让join(" ")处理其余的内容:
第一个

JqPlay(第一次)
1zmg4dgp

1zmg4dgp4#

在我得到答案之前,我向一位朋友寻求帮助。他用另一种方法回应:

cat sample.json|jq -r '((.Tags[]|select(.Key == "Name").Value)? // "") as $name|{together: (.InstanceId + " " + $name)}'

相关问题