Импорт простого текстового файла в JSON через JQ - PullRequest
2 голосов
/ 26 февраля 2020

У меня есть два файла:

id_rsa

-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----

и id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAA...

Используя JQ, как можно импортировать их в json файл как:

{
  "pem": "-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----",
  "pub": "ssh-rsa AAAAB3NzaC1yc2EAAA..."
}

Я пробовал пару, но она не работает:

jq --null-input --argfile pem id_rsa --argfile pub id_rsa.pub '.pem=$pem | .pub=$pub'
jq: Bad JSON in --argfile pem id_rsa: Invalid numeric literal at line 1, column 11

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Предполагая, что ваш jq поддерживает параметр командной строки --rawfile (как и jq 1.6), проще всего было бы использовать его, например:

jq -Rs --rawfile pub id_rsa.pub '{pem: ., pub: $pub}' id_rsa

Без --rawfile

jq -Rs --argfile pub <(jq -R '{pub: .}' id_rsa.pub) '{pem: .} + $pub' id_rsa

Конечные символы новой строки

Если вы хотите убедиться, что в конце строк нет конечных символов \n, вы можете добавить вызовы к sub("\n$";"") в качестве оправданного.

0 голосов
/ 26 февраля 2020

Поскольку jq не поддерживает готовый текстовый файл, читаемый в обычном режиме, лучше всего использовать передаваемый файл в виде base64 строк и декодировать обратно внутрь jq.

./jq-linux64 -n --arg pub "$(base64 id_rsa.pub | tr -d \\n)" \
                --arg priv "$(base64 id_rsa | tr -d \\n)" \
                '{ pub: $pub|@base64d, pem: $priv|@base64d }'

Поскольку jq-1.5 не поддерживает @base64d из коробки. Вы можете загрузить jq-1.6 с официального зеркала и дать ему разрешение на выполнение с chmod +x для файла перед выполнением вышеуказанной команды.

...