jq를 사용하여 하위 JSON 요소 값 편집

jq를 사용하여 하위 JSON 요소 값 편집

jq를 사용하여 자식의 값을 변경하려고 합니다. 예를 들어, "test2"의 값을 ["yo", "bye"]에서 ["hi"]로 변경하고 싶습니다.

{
   "title": "hello",
   "body": {
       "test1": 123,
       "test2": [
           "yo",
           "bye"  
       ]
   }
}

지금까지는 루트의 하위 키 값만 변경할 수 있습니다. 이것을 받아들이고 헤더 대신 .body.test2로 이동하는 방법을 모르겠습니다.

cat test.conf | jq 'to_entries | map(if .key == "title" then . + {"value":"hello world"} else . end) | from_entries' > test2.conf

답변1

(우편@glennjackman시스템에서 질문이 자동으로 삭제되는 것을 방지하기 위해 커뮤니티 답변으로 댓글을 남깁니다.)

jq '.body.test2 = ["hi"]'할 것이다

답변2

주문하다

jq '.body.test2 = ["hi"]' test.conf >test2.conf

...이 작업을 수행하지만 test2추가할 키 이름과 텍스트를 하드코딩 하지 않고도 작업을 더 효과적으로 제어할 수 있다고 가정하면 다음과 같습니다.

printf '%s\n' "line 1" "line 2" "line 3" |
jq -SR . |
jq --arg section test2 '.body[$section] = [inputs]' test.conf - >test2.conf

이는 임의의 텍스트 줄(예에서는 세 줄이지만 이론적으로는 cat여기에서 텍스트 문서를 가져오거나 다음 명령에 인수로 직접 전달할 수 있음 jq) jq -SR .을 사용하여 두 번째로 파이프 jq하여 삽입합니다 . body키 아래의 올바른 섹션 아래에 배열하십시오 .

-최종 호출에서 두 번째 입력 파일 이름으로 사용되면 유틸리티는 표현식 jq대신 표준 입력 스트림의 JSON 문자열을 삽입합니다 .inputsjq

문제의 문서가 주어지면 위 파이프라인은 다음과 같은 JSON 문서를 생성합니다 test2.conf.

{
  "title": "hello",
  "body": {
    "test1": 123,
    "test2": [
      "line 1",
      "line 2",
      "line 3"
    ]
  }
}

관련 정보