【问题标题】:Creating Array of Objects from Bash Array using jq使用 jq 从 Bash 数组创建对象数组
【发布时间】:2021-12-19 04:14:55
【问题描述】:

我正在尝试在给定 bash 中使用 jq 的数组的情况下在 bash 中创建一个对象数组。

这是我卡住的地方:

IDS=("baf3eca8-c4bd-4590-bf1f-9b1515d521ba" "ef2fa922-2038-445c-9d32-8c1f23511fe4")
echo "${IDS[@]}" | jq -R '[{id: ., names: ["bob", "sally"]}]'

结果:

[
   {
     "id": "baf3eca8-c4bd-4590-bf1f-9b1515d521ba ef2fa922-2038-445c-9d32-8c1f23511fe4",
     "names": [
       "bob",
       "sally"
     ]
   }
]

我想要的结果:

[
   {
     "id": "baf3eca8-c4bd-4590-bf1f-9b1515d521ba",
     "names": [
       "bob",
       "sally"
     ]
   },
   {
     "id": "ef2fa922-2038-445c-9d32-8c1f23511fe4",
     "names": [
       "bob",
       "sally"
     ]
   }
]

任何帮助将不胜感激。

【问题讨论】:

    标签: arrays bash jq


    【解决方案1】:

    使用printf '%s\0'将您的bash数组拆分为NUL分隔的项目,然后使用-R--raw-input读取原始流,并在您的jq过滤器中使用split将它们拆分为一个数组,然后分隔符"\u0000":

    printf '%s\0' "${IDS[@]}" | jq -Rs '
      split("\u0000") | map({id:., names: ["bob", "sally"]})
    '
    

    【讨论】:

    • 在这种情况下 null 的目的是什么?
    • @dan null 不能出现在 C 字符串或任何模仿它们的东西中;因此,它们往往可以安全地用作分隔符。 (与有时 确实 出现在正常字符串中间的空格、换行符等相反。)在这种情况下,字符串看起来很简单,所以换行符可能足够安全,但仅此而已并非总是如此。
    • @GordonDavisson 确实如此,但是我尝试了这个示例,使用了一个具有多行元素的 bash 数组,但所有内容仍然在新行上拆分。使用接受的答案,将其拆分为对象 ({ }),并使用空值将其拆分为数组 ([ ])。
    • @dan 您能否提供您的“具有多行元素的 bash 数组”以及您是如何创建它的?
    • @dan 你说得对,我忘了--slurp 输入。修好了。
    【解决方案2】:
    for id in "${IDS[@]}" ; do
      echo "$id"
    done | jq -nR '[ {id: inputs, names: ["bob", "sally"]} ]'
    

    或作为单行:

    printf "%s\n" "${IDS[@]}" | jq -nR '[{id: inputs, names: ["bob", "sally"]}]'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多