JQ를 사용하여 JSON 파일에 키-값 쌍을 추가하는 방법은 무엇입니까?

JQ를 사용하여 JSON 파일에 키-값 쌍을 추가하는 방법은 무엇입니까?

다음 위치에 JSON 파일이 있습니다 /tmp/target.json.

{
  "compileOnSave": false,
  "compilerOptions": {
    "baseUrl": "./",
    ...
  }
}

다음과 같이 새 키 값 쌍을 추가하고 싶습니다.

{
  "compileOnSave": false,
  "compilerOptions": {
    "skipLibCheck": true,
    "baseUrl": "./",
    ...
  }
}

다음 명령을 사용하지만 작동하지 않습니다.

jq --argjson addobj '{"skipLibCheck": "true"}' '
  .compilerOptions{} |= $addobj
' /tmp/target.json

다음 오류가 발생합니다.

jq: error: syntax error, unexpected '{', expecting $end (Unix shell quoting issues?) at <top-level>, line 2:
  .compilerOptions{} |= $addobj                  
jq: 1 compile error

내가 뭘 잘못했나요? 예상대로 작동하게 하려면 어떻게 해야 합니까?

답변1

이와 같이:

$ jq '.compilerOptions.skipLibCheck=true' file.json
{
  "compileOnSave": false,
  "compilerOptions": {
    "baseUrl": "./",
    "skipLibCheck": true
  }
}

답변2

키와 그 값을 추가하는 가장 간단한 방법이 도입되었습니다.다른 대답으로. 이 답변은 object 의 키 목록 끝에 키를 추가합니다 compilerOptions. 일반적으로 키의 순서는 중요하지 않습니다. 사용할 수 있는 특정 방식으로 정렬해야 하는 경우대량으로. 그러나 어떤 이유로든 기존 키보다 먼저 키를 추가하고 싶어한다는 것을 알았습니다 baseUrl.

해당 위치에 키를 추가할 수 있으며 기존 객체에 새 키를 추가하는 대신 기존 객체의 키를 새 키 끝에 추가합니다. 따라서 기존 JSON 문서가 주어지면

{
  "compileOnSave": false,
  "compilerOptions": {
    "baseUrl": "./",
    "jerry": "Was a race car driver"
  }
}

...우리는 사용하고 싶을 수도 있습니다

jq --argjson skipLibCheck true '.compilerOptions = $ARGS.named + .compilerOptions' file

위의 예제 문서를 보면 다음과 같은 결과가 생성됩니다.

{
  "compileOnSave": false,
  "compilerOptions": {
    "skipLibCheck": true,
    "baseUrl": "./",
    "jerry": "Was a race car driver"
  }
}

사물은 명령줄에서 $ARGS.named사용 및/또는 정의된 키-값 쌍을 포함하는 개체입니다. 위의 예에서는 이 기능이 버전 1.5 이후에 도입되었습니다.--arg--argjson{"skipLibCheck":true}$ARGSjq

이전 1.5 버전의 경우 jq다음을 사용할 수 있습니다.

jq --argjson skipLibCheck true '.compilerOptions = { skipLibCheck: $skipLibCheck } + .compilerOptions' file

값을 특수 부울이 아닌 문자열로 지정하려면 --arg대신 사용하세요.--argjsontruetrue

키를 추가하는 또 다른 방법은 다음과 같습니다.(다른 답변에서 언급된 내용) 위 명령과 동일한 패턴을 따릅니다. 또한 --arg어떻게 보이는지 보여주기 위해 여기에 문자열 삽입으로 사용하도록 전환했습니다 .true

jq --arg skipLibCheck true '.compilerOptions += $ARGS.named' file

...당신에게 줄 것입니다

{
  "compileOnSave": false,
  "compilerOptions": {
    "baseUrl": "./",
    "jerry": "Was a race car driver",
    "skipLibCheck": "true"
  }
}

이전 1.5 버전의 경우 jq다음을 사용할 수 있습니다.

jq --arg skipLibCheck true '.compilerOptions += { skipLibCheck: $skipLibCheck }' file

관련 정보