jq 覆盖唯一键而不是添加到文件中的 JSON 对象

jq 覆盖唯一键而不是添加到文件中的 JSON 对象

JSON 文件

当前的

{
  "auths": {
    "test": {
      "auth": "testserfdddd"
    }
  }
}

期望的

{
  "auths": {
    "test": {
      "auth": "testserfdddd"
    },
    "myrepo.com" {
      "auth": "passworder"
    }
  }
}

测试

作为命令行上的简单测试,我执行以下操作:

 cat .docker/config.json | jq '.auths += {"myrepo.com": {"auth": "passworder"}}'

结果就是我想要的

{
  "auths": {
    "test": {
      "auth": "testserfdddd"
    },
    "repo.com": {
      "auth": "test"
    }
  }
}

不过我希望通过 bash 脚本执行相同的逻辑。

bash脚本

REPO=repo.com
PASSWD=passworder

$JQ --arg repo "$REPO" --arg passwd "$PASSWD" '.auths.[$repo] += {"auth": $passwd}' .docker/config.json

然而,这会覆盖test.authtorepo.com.auth并且不会添加到auths密钥

运行 bash 脚本时的结果提供以下结果

{
  "auths": {
    "repo.com": {
      "auth": "passworder
    }
  }
}

先前的对象被完全覆盖。我通常需要在表达式中适应什么模式jq?由于参数repo是唯一的(test与不同repo.com),为什么该+=操作在 bash 脚本中不起作用?

答案1

JQ 要求将 key 放在括号中:

#!/bin/bash
FILE=testfile.json
REP=repo.com
PWD=passworder

cat $FILE | jq --arg repo "$REP" --arg pass "$PWD" '.auths += { ($repo) : {"auth": $pass}}'

答案2

与相比,使用稍微简化的语法白猫头鹰的回答

repo=repo.com
auth=passworder

jq --arg auth "$auth" --arg repo "$repo" '.auths[$repo] = { auth: $auth }' file

如果auth是叶对象中的唯一键,或者如果保证叶对象不存在:

repo=repo.com
auth=passworder

jq --arg auth "$auth" --arg repo "$repo" '.auths[$repo].auth = $auth' file

相关内容