Jq

jq 覆蓋唯一鍵而不是添加到文件中的 JSON 對象

  • June 30, 2022

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 腳本中不起作用?

JQ 要求將密鑰放在括號中:

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

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

與White Owl 的回答相比,使用稍微簡化的語法:

repo=repo.com
auth=passworder

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

Ifauth是葉子對像中的唯一鍵,或者保證葉子對像不存在:

repo=repo.com
auth=passworder

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

引用自:https://unix.stackexchange.com/questions/708144