jq의 개발 버전에서는 jq '.x.y |= if . then 123 else empty end'
으로이 작업을 수행 할 수 있습니다. (버그 #13134이 해결 되었기 때문에)jq : 기존 데이터 만 업데이트하는 방법은 무엇입니까?
jq 1.5에서 어떻게 할 수 있습니까?
예 : {"x": {"y": 5}}
에
는, Y는, (123)로 변경되어야하지만
{"x": {"z": 9}}
에서 아무것도 변화 안된다.
jq의 개발 버전에서는 jq '.x.y |= if . then 123 else empty end'
으로이 작업을 수행 할 수 있습니다. (버그 #13134이 해결 되었기 때문에)jq : 기존 데이터 만 업데이트하는 방법은 무엇입니까?
jq 1.5에서 어떻게 할 수 있습니까?
예 : {"x": {"y": 5}}
에
는, Y는, (123)로 변경되어야하지만
{"x": {"z": 9}}
에서 아무것도 변화 안된다.
|=
을 사용해야합니까? 그렇지 않다면 평범한 과제를 쓸 수 있습니까? 예 : 와
jq -Mnc '
{"x": {"y": 5}} | if .x.y != null then .x.y = 123 else . end
, {"x": {"z": 9}} | if .x.y != null then .x.y = 123 else . end
'
출력
{"x":{"y":123}}
{"x":{"z":9}}
내장 has()
기능 :
jq -nc '{"x":{"y": 5}} | if (.x | has("y")) then .x.y=123 else empty end'
출력 :
{"x":{"y":123}}
사용하여 스트림이 실제로 아주 능숙하게이 문제를 해결할 수 있습니다. 객체에 대한 스트림은 경로와 값을 입력의 실제 존재하는 값으로 변환합니다. 따라서 경로가 포함 된 쌍을 검색하고 스트림을 재구성하는 동안 값을 업데이트하십시오.
$ jq --argjson path '["x","y"]' --argjson new '123' '
fromstream(tostream|select(length == 2 and .[0] == $path)[1] = $new)
' input.json
다음 둘 다 (이후에 1.5를 사용 여부) 원하는 결과를 얻을 수 있지만, 의미있는 중요한 차이점 ({"x": null}
및 {}
차이로 할 필요)가있다 :
if has("x") and (.x | has("y")) then .x.y = 123 else . end
if .x.y? then .x.y = 123 else . end