json - jq - 无法在 while 循环中将对象 append 到数组

我有这个包含服务帐户的 service-accounts-list.txt 文件:

serviceAccount:p12345-001@gcp-sa-logging.iam.gserviceaccount.com
serviceAccount:p12345-002@gcp-sa-logging.iam.gserviceaccount.com
serviceAccount:p12345-003@gcp-sa-logging.iam.gserviceaccount.com
serviceAccount:p12345-004@gcp-sa-logging.iam.gserviceaccount.com
serviceAccount:p12345-005@gcp-sa-logging.iam.gserviceaccount.com

和这个我想将数据 append 到的 results.json 文件:

{
  "access": [
    {
      "role": "WRITER",
      "specialGroup": "projectWriters"
    },
    {
      "role": "OWNER",
      "specialGroup": "projectOwners"
    },
    {
      "role": "READER",
      "specialGroup": "projectReaders"
    }
  ]
}

预期结果:我想为 service-accounts-list.txt 中的每一行添加一个对象,如下所示:

{
  "access": [
    {
      "role": "WRITER",
      "specialGroup": "projectWriters"
    },
    {
      "role": "OWNER",
      "specialGroup": "projectOwners"
    },
    {
      "role": "READER",
      "specialGroup": "projectReaders"
    },
    {
      "role": "WRITER",
      "userByEmail": "serviceAccount:p12345-001@gcp-sa-logging.iam.gserviceaccount.com"
    },
    {
      "role": "WRITER",
      "userByEmail": "serviceAccount:p12345-002@gcp-sa-logging.iam.gserviceaccount.com"
    },
    {
      "role": "WRITER",
      "userByEmail": "serviceAccount:p12345-003@gcp-sa-logging.iam.gserviceaccount.com"
    },
    {
      "role": "WRITER",
      "userByEmail": "serviceAccount:p12345-004@gcp-sa-logging.iam.gserviceaccount.com"
    },
    {
      "role": "WRITER",
      "userByEmail": "serviceAccount:p12345-005@gcp-sa-logging.iam.gserviceaccount.com"
    }
  ]
}

到目前为止,我的 bash 脚本如下所示:

while read p;
do
  cat result.json | jq --arg email "$p" '.access += [{"role": "WRITER", "userByEmail": $email}]' > result.json
done < service-accounts-list.txt

生成的 result.json 文件实际上是空的。如果我将输出重定向到 example > result2.json,它会正确添加最后一个服务帐户,如下所示:

{
  "access": [
    {
      "role": "WRITER",
      "specialGroup": "projectWriters"
    },
    {
      "role": "OWNER",
      "specialGroup": "projectOwners"
    },
    {
      "role": "READER",
      "specialGroup": "projectReaders"
    },
    {
      "role": "WRITER",
      "userByEmail": "serviceAccount:p12345-005@gcp-sa-logging.iam.gserviceaccount.com"
    }
  ]
}

看来 jq 语法是正确的。我尝试添加 --unbuffered 标志但无济于事。

我错过了什么?

最佳答案

也许最简单有效的解决方案是:

jq -nR --argfile result result.json '
  $result 
  | .access += [{role: "WRITER", userByEmail: inputs}] 
' service-accounts-list.txt

注意——没有 slurping,没有 split ,没有 shell 脚本。如果您对 --argfile 的使用感到困扰,请随意使用 --slurpfile 但通过编写 $result[0] 来“取消”$result。

https://stackoverflow.com/questions/61737304/

相关文章:

kubernetes - Cloud Composer 实例节点和自动缩放

c - 等待运行目标的 makefile 列表

python - 将多个子字符串匹配模式提取到列中

json - 在 typescript 中为 JSON 文件添加类型定义

java - Intellij Idea : sbt refresh FetchError$Down

google-cloud-platform - GCP Nat 后超时

python - 如何在 Nifi 中将 pandas 数据帧从一个处理器传递到另一个处理器?

python - Pandas to_numpy() 生成列表数组。如何从中获取二维 numpy 数

javascript - web3.eth.accounts[0] 返回未定义和 app.vote(

wordpress - Post Object Timber/Twig WordPress 问题