![jq를 사용하여 하위 JSON 요소 값 편집](https://linux55.com/image/79174/jq%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%95%98%EC%9C%84%20JSON%20%EC%9A%94%EC%86%8C%20%EA%B0%92%20%ED%8E%B8%EC%A7%91.png)
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 문자열을 삽입합니다 .inputs
jq
문제의 문서가 주어지면 위 파이프라인은 다음과 같은 JSON 문서를 생성합니다 test2.conf
.
{
"title": "hello",
"body": {
"test1": 123,
"test2": [
"line 1",
"line 2",
"line 3"
]
}
}