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

관련 정보