Shell

Linux Shell - 如何在使用 sed 讀取 json 時刪除 JQ 生成的轉義字元?

  • March 15, 2019

我正在嘗試讀取一個 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 屬性包含反斜杠,因此伺服器無法讀取通過 curl 發送的屬性。

body的輸出如下

{ "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 不生成反斜杠,因為文件明確表示它將將該變數視為字元串。有人可以為我提供解決方案的提示嗎?

用於--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

引用自:https://unix.stackexchange.com/questions/506451