jq를 사용하여 배열에 객체 문자열을 추가하면 이스케이프 문자가 변환되지 않습니다.

jq를 사용하여 배열에 객체 문자열을 추가하면 이스케이프 문자가 변환되지 않습니다.

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

이 질문에는 두 가지 측면이 있습니다.

  1. jqJSON을 사용 하여 전달하면 --arg텍스트가 필요합니다. 이는 jq주어진 텍스트 JSON이 문자열로 인코딩된다는 것을 의미합니다. 이 유틸리티 에는 전달된 데이터가 JSON 문서인 경우 jq별도의 옵션이 있습니다 .--argjson

  2. 가장 일반적인 경우에는 내용을 인코딩하지 않고 JSON 문서에 셸 변수를 삽입하고 싶지 않습니다. 예를 들어 JSON이 아닌 입력을 받아 JSON 출력을 생성하는 다른 도구를 jq사용하거나 사용하여 변수의 데이터를 전달하면 됩니다 .--argjo

  • 따옴표 없이 사용할 수도 있습니다. []그러면 쉘 옵션(또는 이에 상응하는 옵션)이 설정된 경우 쉘에서 오류가 발생합니다. 쉘에는 기본적으로 쉘 옵션이 설정되어 있습니다.failglobnomatchzshzshnomatch

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그런 다음 subnetsadd 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"

관련 정보