Shell
Linux Shell - 如何在使用 sed 讀取 json 時刪除 JQ 生成的轉義字元?
我正在嘗試讀取一個 json 文件並使用它的輸出
jq
來建構另一個 json,結合上述 json 文件和其他值,並將其傳遞給CURL
我讀了文件
policies=$( sed 's/\\//g' policies.json)
我使用以下
jq
命令建構新的 jsonBODY=$( 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
。