json 텍스트에 값을 추가하고 싶지만 jq '.jq_path +{"key":"value"}'
해당 부분만 출력되고 jq '. +{jq_path:{"key":"value"}}'
경로가 가리키는 부분에 작성된 모든 내용이 대체됩니다(여기에서는 jq_path로 설명됨).
입력하다
{
"object":{
"key1":"value1",
"key2":"value2"
},
"key3":"value3"
}
예상 출력:
{
"object":{
"key1":"value1",
"key2":"value2",
"key":"value"
},
"key3":"value3"
}
내가 얻은 것jq '. +{"object":{"key":"value"}}'
{
"object":{
"key":"value"
},
"key3":"value3"
}
나에게 적합한 다음 해결 방법을 찾았습니다.
function json_add_value(){
input=$(</dev/stdin); jq_path=$1; jq_addition=$2
jq_section=$(echo $input | jq "$jq_path +{$jq_addition}" | sed -e '1d' -e '$d')
echo $input | jq "$jq_path ={$jq_section}"
}
# syntax
cat $json_file | json_add_value ".jq_path" '"key":"value"'
하지만 저는 좀 더 공식적인 방법을 사용하고 싶습니다(최대한 jq만 사용). 어떻게 해야 하나요?
답변1
두 가지 방법:
추가하거나 변경할 명시적 키의 경로를 제공하고 해당 값을 할당합니다.
jq '.object.key = "value"' file
+=
경로에 개체를 "추가"하는 데 사용됩니다.object
. 지정된 키가 이미 존재하는 경우.object
해당 값이 새 값으로 업데이트됩니다.jq '.object += { "key": "value" }' file
각 경우의 결과는 동일합니다.
{
"object": {
"key1": "value1",
"key2": "value2",
"key": "value"
},
"key3": "value3"
}
첫 번째 시도의 문제점은 (본질적으로 .object + { "key": "value" }
) 객체를 추출한 다음 객체에 추가한다는 것입니다. 이 작업의 결과로 .object
새 키+값이 추가되고 다른 것은 추가되지 않습니다(다른 최상위 키는 손실됩니다).
두 번째 시도의 문제는 (기본적으로 . + { "object": { "key": "value" } }
) object
최상위 개체에 새 키를 추가하여 이전 값을 덮어쓴다는 것입니다.