Linux Shell - sedを使用してjsonを読み取るときにJQで生成されたエスケープ文字を削除する方法は?

Linux Shell - sedを使用してjsonを読み取るときにJQで生成されたエスケープ文字を削除する方法は?

jsonファイルを読み込み、その出力を使用してjq上記のjsonファイルと異なる値を組み合わせて別のjsonを構築して渡そうとします。CURL

私は次のようにファイルを読みました。policies=$( sed 's/\\//g' policies.json)

jq次のコマンドを使用して新しいjsonをビルドします。

BODY=$( jq -n \
            --arg cid "$chaincodeId" \
            --arg cv "$chaincodeV" \
            --arg ct "$chaincodeT" \
            --arg ar "$chaincodeArgs" \
            --arg pol "$policies" \
            '{chaincode_id: $cid, chaincode_version: $cv, chaincode_type: $ct, endorsement_policy: $pol}' )

最初の4つのプロパティではうまく機能します。ただし、endorsement_policy属性にはバックスラッシュが含まれているため、サーバーはカールを介して送信された属性を読み取ることができません。

本文の出力は次のとおりです。

{ "chaincode_id": "IdentityManager", "chaincode_version": "testcc2", "chaincode_type": "node", "endorsement_policy": "{\n \"identities\": [\n {\n \"role\": {\n \"name\": \"member\",\n \"mspId\": \"org1\"\n }\n },\n {\n \"role\": {\n \"name\": \"member\",\n \"mspId\": \"org2\"\n }\n },\n {\n \"role\": {\n \"name\": \"member\",\n \"mspId\": \"org3\"\n }\n }\n ],\n \"policy\": {\n \"1-of\": [\n {\n \"signed-by\": 0\n },\n {\n \"signed-by\": 1\n },\n {\n \"signed-by\": 2\n }\n ]\n }\n}" }

jqがバックスラッシュを生成しないように強制する方法を理解できません。これは、ドキュメントが変数を文字列として扱うことが示されているからです。誰でも私に解決策のヒントを与えることができますか?

ベストアンサー1

以下を使用して変数--argにデータを渡すときjqひも。このようにJSONフラグメントを渡すと、jqエスケープする必要がある文字列のビットが自然にエスケープされ、有効なJSONエンコード文字列になります。

テキスト文字列ではなくJSONとして使用したいJSONフラグメントを渡す場合は、--argjson代わりに--arg

簡単に言えば、使うべきだと思います。

BODY=$( jq -n \
            --arg cid "$chaincodeId" \
            --arg cv "$chaincodeV" \
            --arg ct "$chaincodeT" \
            --arg ar "$chaincodeArgs" \
            --argjson pol "$policies" \
            '{chaincode_id: $cid, chaincode_version: $cv, chaincode_type: $ct, endorsement_policy: $pol}' )

また、ソースpolicies.jsonファイルが正しくエンコードされたJSONファイルの場合バックスラッシュを削除しないでください。

policies.json文書に直接挿入するには、次の手順を実行します。可能使用

BODY=$( jq -n \
            --arg cid "$chaincodeId" \
            --arg cv "$chaincodeV" \
            --arg ct "$chaincodeT" \
            --arg ar "$chaincodeArgs" \
            --slurpfile pol policies.json \
            '{chaincode_id: $cid, chaincode_version: $cv, chaincode_type: $ct, endorsement_policy: $pol[] }' )

(参考$pol[])、しかし頻繁に使用しないため、どのような状況で衝突が発生するのか100%確信できません。

また、見ることができますjqマニュアルの「jq呼び出し」セクション

おすすめ記事