2017-09-15 6 views

답변

1

|=을 사용해야합니까? 그렇지 않다면 평범한 과제를 쓸 수 있습니까? 예 : 와

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}}  
1

내장 has() 기능 :

jq -nc '{"x":{"y": 5}} | if (.x | has("y")) then .x.y=123 else empty end' 

출력 :

{"x":{"y":123}} 
0

사용하여 스트림이 실제로 아주 능숙하게이 문제를 해결할 수 있습니다. 객체에 대한 스트림은 경로와 값을 입력의 실제 존재하는 값으로 변환합니다. 따라서 경로가 포함 된 쌍을 검색하고 스트림을 재구성하는 동안 값을 업데이트하십시오.

$ jq --argjson path '["x","y"]' --argjson new '123' ' 
fromstream(tostream|select(length == 2 and .[0] == $path)[1] = $new) 
' input.json 
1

다음 둘 다 (이후에 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