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

この質問には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"

関連情報