При использовании --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
.
Используйте sed, чтобы отфильтровать строки с комментариями перед передачей их вашей программе. Вы можете выбрать одну из этих форм (, но вторая, подстановка процесса, поддерживается не всеми оболочками ):
.sed '/^#/d' input_file | myprogram
myprogram < <(sed '/^#/d' input_file)
/^#/
— это регулярное выражение, которое соответствует любой строке, начинающейся с #
, d
— это команда для удаления этих строк из вывода. (Не волнуйтесь, input_file
не будет измененsed
).
Вы можете использовать grep
для фильтрации строк, начинающихся с " #":
grep -v '^#' input_file | myprogram
Строка, переданная в grep
, является регулярным выражением. Он соответствует началу строки (^
), за которой следует #
. -v
инвертирует логику, чтобы показать строки, НЕ соответствующие этому шаблону.
Обычно я выбираю grep
, чтобы просто отображать/отбрасывать целые строки, и sed
, если хочу изменить данные внутри строк. Но, конечно, решение sed
также работает.