Как игнорировать перенаправление определенных строк

При использовании --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.

1
24.06.2020, 19:38
2 ответа

Используйте sed, чтобы отфильтровать строки с комментариями перед передачей их вашей программе. Вы можете выбрать одну из этих форм (, но вторая, подстановка процесса, поддерживается не всеми оболочками ):

.
sed '/^#/d' input_file | myprogram
myprogram < <(sed '/^#/d' input_file)

/^#/— это регулярное выражение, которое соответствует любой строке, начинающейся с #, d— это команда для удаления этих строк из вывода. (Не волнуйтесь, input_fileне будет измененsed).

1
18.03.2021, 23:24

Вы можете использовать grepдля фильтрации строк, начинающихся с " #":

grep -v '^#' input_file | myprogram

Строка, переданная в grep, является регулярным выражением. Он соответствует началу строки (^), за которой следует #. -vинвертирует логику, чтобы показать строки, НЕ соответствующие этому шаблону.

Обычно я выбираю grep, чтобы просто отображать/отбрасывать целые строки, и sed, если хочу изменить данные внутри строк. Но, конечно, решение sedтакже работает.

2
18.03.2021, 23:24

Теги

Похожие вопросы