jq를 사용하여 json 문서의 단일 값을 어떻게 업데이트합니까?


104

내가 아주 명백한 것을 간과했다면 사과; 방금 발견 jq했고 주변 데이터에 영향을주지 않고 하나의 JSON 값을 업데이트하는 데 사용하려고합니다.

curl결과 를에 파이프하고 jq값을 업데이트하고 업데이트 된 JSON을 curl -X PUT. 같은 것

curl http://example.com/shipping.json | jq '.' field: value | curl -X PUT http://example.com/shipping.json

지금까지를 사용하여 함께 해킹 sed했지만에서 |=연산자 의 몇 가지 예를 살펴본 후에 jq는 이러한 작업이 필요하지 않다고 확신합니다.

다음은 JSON 샘플입니다 . 나머지 JSON은 유지하면서을 jq설정 "local": false하는 데 어떻게 사용 합니까?

{
  "shipping": {
    "local": true,
    "us": true,
    "us_rate": {
      "amount": "0.00",
      "currency": "USD",
      "symbol": "$"
    }
  }
}

답변:


126

=연산자를 사용하여 개체의 값을 설정합니다 . |=반면에 값을 업데이트하는 데 사용됩니다. 미묘하지만 중요한 차이입니다. 필터의 컨텍스트가 변경됩니다.

속성을 상수 값으로 설정하고 있으므로 =연산자를 사용하십시오 .

.shipping.local = false

속성에 값을 설정할 때 반드시 존재해야하는 것은 아닙니다. 이 방법으로 새 ​​값을 쉽게 추가 할 수 있습니다.

.shipping.local = false | .shipping.canada = false | .shipping.mexico = true

10
이 샘플은 정상적인 값에 적합하지 않습니다. 당신이 정상적인 값을 변경해야하는 경우 그래서, 당신은 추가 할 필요가 "같은, 그것으로 .shipping.local = "new place". 따라서 전체 명령은 curl http://example.com/shipping.json | jq '.shipping.local = "new place"'. 그렇지 않으면 이상한 오류가 발생합니다.
BMW는

8
@BMW 뭐야? 여기는 완벽합니다. 모든 유효한 json 값이 유효합니다. 이것은 리터럴 일뿐 false입니다. 값이 문자열 일 필요는 없습니다.
Jeff Mercado

@BMW OP는 false. 뭐가 문제 야?
SOFe

17

값 업데이트 (.foo.bar를 "새 값"으로 설정) :

jq '.foo.bar = "new value"' file.json

변수를 사용하여 값 업데이트 (.foo.bar를 "hello"로 설정) :

variable="hello"; jq --arg variable "$variable" '.foo.bar = $variable' file.json

나는 이것을 예제로 사용하여 쉘을 통해 NPM package.json의 이름을 바꾸었고 100 % 작동했습니다.
Machado

2
이것은 실제로 파일의 내용을 바꾸지 않습니다. 표준 출력으로 만 인쇄됩니다. 변경 사항을 유지하려면 stout을 파일에 다시 저장해야합니다. 참조 stackoverflow.com/a/60744617/1626687
spuder

1

연산자 | =와 유사한 함수는 맵입니다. map은 어레이에 대한 이전 필터의 요구 사항을 피하는 데 적합합니다.

데이터가 배열이라고 가정합니다 (이 예에서는 매우 일반적 임).

[
  {
    "shipping": {
      "local": true,
      "us": true,
      "us_rate": {
        "amount": "1.00",
        "currency": "USD",
        "symbol": "$"
      }
    }
  },
  {
    "shipping": {
      "local": true,
      "us": true,
      "us_rate": {
        "amount": "1.00",
        "currency": "USD",
        "symbol": "$"
      }
    }
  }
]

따라서 코드의 배열을 다음과 같이 고려할 필요가 있습니다.

http://example.com/shipping.json | jq '.[] | .shipping.local = "new place"' | curl -X PUT http://example.com/shipping.json

또는 모든 배열 요소에서 작동하도록 만들어진 map 함수를 다음과 같이 사용합니다.

http://example.com/shipping.json | jq 'map(.shipping.local = "new place")' | curl -X PUT http://example.com/shipping.json

관측

배우는 사람들을 위해, 당신은 또한 jq 사용법에서 약간의 실수를했습니다. 단지 그것이 프로그램으로 첫 번째 매개 변수를 "읽는다"는 것을 고려하십시오. 따라서 원하는 모든 명령은 다음을 호출 한 후 첫 번째 문자열에 포함되어야합니다. 프로그램.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.