将 JSON 输入子数组转换为字符串顺序列表输出

问题描述 投票:0回答:2

这是我的输入:

{
  "alias-name": "soufriere",
  "member-entry": {
    "alias-entry-name": [
      "21:00:f4:e9:d4:50:56:7e",
      "21:00:f4:e9:d4:50:56:7f"
    ]
  }
}
{
  "alias-name": "stromboli",
  "member-entry": {
    "alias-entry-name": [
      "21:00:f4:e9:d4:50:56:8e"
      "21:00:f4:e9:d4:50:56:9e"
    ]
  }
}

我想把它变成输出

alicreate "soufriere","21:00:f4:e9:d4:50:56:7e;21:00:f4:e9:d4:50:56:7f"
alicreate "stromboli","21:00:f4:e9:d4:50:56:8e;21:00:f4:e9:d4:50:56:9e"

我试过这个:

jq -r --arg quote "\"" ("alicreate " + $quote + ."alias-name" + $quote + "," + $quote + ."member-entry"."alias-entry-name"[] + $quote)'

但它给出的是一行一行而不是顺序的。

alicreate "soufriere","21:00:f4:e9:d4:50:56:7e"
alicreate "soufriere","21:00:f4:e9:d4:50:56:7f"
alicreate "stromboli","21:00:f4:e9:d4:50:56:8e"
alicreate "stromboli","21:00:f4:e9:d4:50:56:9e"
json jq
2个回答
2
投票

迭代数组会产生它的项目。要将项目连接到单个字符串中,请使用

join
过滤器。此外,在字符串内部,您可以使用
\"
生成引号,并使用 字符串插值
\(…)
来注入值。

jq -r '"alicreate \"\(."alias-name")\",\"\(
  ."member-entry"."alias-entry-name" | join(";")
)\""'
alicreate "soufriere","21:00:f4:e9:d4:50:56:7e;21:00:f4:e9:d4:50:56:7f"
alicreate "stromboli","21:00:f4:e9:d4:50:56:8e;21:00:f4:e9:d4:50:56:9e"

演示

请注意,您可能希望正确转义这些值,而不仅仅是用双引号将它们括起来,但使用哪种编码很大程度上取决于输出的用例。


1
投票

我们可以使用

@csv
过滤器来为我们处理引用:

jq -r '
  [."alias-name", (."member-entry"."alias-entry-name" | join(";"))]
  | @csv
  | "alicreate " + .
'
alicreate "soufriere","21:00:f4:e9:d4:50:56:7e;21:00:f4:e9:d4:50:56:7f"
alicreate "stromboli","21:00:f4:e9:d4:50:56:8e;21:00:f4:e9:d4:50:56:9e"
© www.soinside.com 2019 - 2024. All rights reserved.