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スクリプトを介して同じロジックを実行したいと思います。

バッシュスクリプト

REPO=repo.com
PASSWD=passworder

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

ただし、これはtest.authto をオーバーライドし、キーrepo.com.authに追加しません。auths

Bashスクリプトを実行したときの結果は次のとおりです。

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

古いオブジェクトを完全に上書きします。一般に、式に適用するにはどのパターンが必要ですかjq?パラメータが一意でrepo異なるtestため、これがbashスクリプトで機能しないrepo.comのはなぜですか?+=

答え1

JQでは、キーを括弧内に入れる必要があります。

#!/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

関連情報