Добавление строки объекта в массив с помощью jq не переводит escape-символы

Вы теряете кавычки из-за расширения оболочки при подстановке команд, вам просто нужно снова заключить это в кавычки. Рекомендуется использовать форму $()вместо обратных кавычек. Это делает ваш код более читабельным.

eval./test.py "$(find./testdata -type f  -printf "\"%p\" ")"

Обновлен :, теперь он ведет себя как другие примеры, я поставил eval впереди, это приведет к правильному расширению/цитированию для вас, чтобы получить отдельные аргументы в кавычках для python.

0
09.11.2021, 23:00
1 ответ

Вопрос двоякий:

  1. Вы передаете JSON jqс помощью --arg, который ожидает текст. Это означает, что jqбудет JSON -кодировать данный текст в строку. У утилиты jqесть отдельная опция --argjsonдля случаев, когда передаваемые данные являются документом JSON.

  2. В самом общем случае вы не хотите внедрять переменные оболочки в документ JSON без кодирования их содержимого. Вы делаете это, передавая данные переменной в jqс помощью --argили используя какой-либо другой инструмент (, например jo), который ожидает ввода не -JSON и создает вывод JSON.

  • Вы также используете []без кавычек, что заставит оболочку жаловаться, если она имеетfailglob(или эквивалентную, например, nomatchв опции оболочки zsh). Оболочка zshимеет параметр оболочки nomatch, установленный по умолчанию.

Вашу проблему лучше всего решить, используя jqдля добавления данных непосредственно в существующий документ:

jq \
        --arg block_id "$block_id" \
        --arg block_parent_id "$block_parent_id" \
        --arg current_index 0 \
        --arg child_sum 0 \
        --arg block_cidr "" \
        --arg block_size "" \
        --arg child_cidr "" \
        --arg child_size "" \
        '. += [ $ARGS.named |.subnets = $ARGS.positional ]' \
        --args \
        <<<"$parent"

В приведенной выше команде я создаю объект, который добавляю в существующий список в $parent, используя $ARGS.namedдля каждой пары простых (скалярных )ключей -значений. Значение $ARGS.named— это объект с ключами и значениями, взятыми из опций --argи их значений. Затем я добавляю массив subnetsс помощью $ARGS.positional. Это значение является массивом значений после --argsв командной строке. Параметр --argsдолжен быть последним параметром в командной строке, а в приведенной выше команде список пуст.

Если вы хотите создать объект, который вы добавляете отдельно:

to_add=$(
jq -n \
        --arg block_id "$block_id" \
        --arg block_parent_id "$block_parent_id" \
        --arg current_index 0 \
        --arg child_sum 0 \
        --arg block_cidr "" \
        --arg block_size "" \
        --arg child_cidr "" \
        --arg child_size "" \
        '[ $ARGS.named |.subnets = $ARGS.positional ]' \
        --args
)

jq --argjson block "$to_add" '. += $block' <<<"$parent"
0
10.11.2021, 06:12

Теги

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