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つの側面があります。
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"