jq를 사용하여 상위 개체 [...]에 개체 {...}를 추가하려고 합니다.
그러나 다음
parent="[]"
block=$(cat << EOF
{
"block_id": "$block_id",
"block_parent_id": "$block_parent_id",
"current_index": 0,
"child_sum": 0,
"block_cidr": "",
"block_size": "",
"child_cidr": "",
"child_size": "",
"subnets": []
}
EOF
)
jq --arg ITEM "$block" '.+[$ITEM]' <<< "$parent"
주어진
[
"{\n\t\"block_id\": \"\",\n\t\"block_parent_id\": \"\",\n\t\"current_index\": 0,\n\t\"child_sum\": 0,\n\t\"block_cidr\": \"\",\n\t\"block_size\": \"\",\n\t\"child_cidr\": \"\",\n\t\"child_size\": \"\",\n\t\"subnets\": []\n}"
]
보시다시피 \n 및 \t와 같은 이스케이프 문자는 문자 그대로 인코딩됩니다. parent[]에 항목을 추가하고 이스케이프 문자(예: \n -> 새 줄)를 올바르게 번역하려면 어떻게 해야 합니까?
인용하다https://replit.com/@LoganLee7/jq-add-item-encodes-nt#main.sh
답변1
나는 답을 찾았습니다:
jq --arg ITEM "$block" '.+[$ITEM|fromjson]' <<< "$parent"
또는
jq --argjson ITEM "$block" '.+[$ITEM]' <<< "$parent"
답변2
이 질문에는 두 가지 측면이 있습니다.
jq
JSON을 사용 하여 전달하면--arg
텍스트가 필요합니다. 이는jq
주어진 텍스트 JSON이 문자열로 인코딩된다는 것을 의미합니다. 이 유틸리티 에는 전달된 데이터가 JSON 문서인 경우jq
별도의 옵션이 있습니다 .--argjson
가장 일반적인 경우에는 내용을 인코딩하지 않고 JSON 문서에 셸 변수를 삽입하고 싶지 않습니다. 예를 들어 JSON이 아닌 입력을 받아 JSON 출력을 생성하는 다른 도구를
jq
사용하거나 사용하여 변수의 데이터를 전달하면 됩니다 .--arg
jo
- 따옴표 없이 사용할 수도 있습니다.
[]
그러면 쉘 옵션(또는 이에 상응하는 옵션)이 설정된 경우 쉘에서 오류가 발생합니다. 쉘에는 기본적으로 쉘 옵션이 설정되어 있습니다.failglob
nomatch
zsh
zsh
nomatch
jq
다음을 사용하여 기존 문서에 데이터를 직접 추가하면 문제가 가장 잘 해결됩니다 .
jq \
--arg block_id "$block_id" \
--arg block_parent_id "$block_parent_id" \
--argjson current_index 0 \
--argjson child_sum 0 \
--arg block_cidr "" \
--arg block_size "" \
--arg child_cidr "" \
--arg child_size "" \
'. += [ $ARGS.named | .subnets = $ARGS.positional ]' \
--args \
<<<"$parent"
위 명령에서는 각 일반(스칼라) 키-값 쌍을 $parent
사용하여 객체를 생성하고 이를 기존 목록에 추가합니다. $ARGS.named
값은 옵션과 해당 값 $ARGS.named
에서 키와 값을 가져온 개체입니다 . --arg
그런 다음 subnets
add array 을 사용합니다 $ARGS.positional
. 값은 --args
명령줄의 후속 값 배열입니다. 이 --args
옵션은 명령줄의 마지막 옵션이어야 하며 위 명령의 목록은 비어 있습니다.
개별적으로 추가된 객체를 생성하려면 다음을 수행하십시오.
to_add=$(
jq -n \
--arg block_id "$block_id" \
--arg block_parent_id "$block_parent_id" \
--argjson current_index 0 \
--argjson child_sum 0 \
--arg block_cidr "" \
--arg block_size "" \
--arg child_cidr "" \
--arg child_size "" \
'[ $ARGS.named | .subnets = $ARGS.positional ]' \
--args
)
jq --argjson block "$to_add" '. += $block' <<<"$parent"