Jq - декодировать значение json в потоке

Мне нужно декодировать значение авторизации из apache в потоке и заменить значение именем пользователя, возвращая измененный json.

оригинальный Json:

{ "time":"2022-04-07T12:53:39.302+0300", 
.... 
"user":"Basic c2RwC2ZhcmZZc3Q6c2RfX2ZhcmVhz3Q = " }

Я хочу получить json:

{ "time":"2022-04-07T12:53:39.302+0300", 
.... 
"user":"<login>" }

Расшифрованное значение здесь <username>:<password>

Я пытаюсь использовать для этого утилиту jq

stdin> | jq -r  '.user | gsub ("Basic "; "") | @base64d | gsub ("^.*:"; "")'

Но jq возвращает само значение, а не измененный json. Кроме того, я получаю сообщение об ошибке, если значение json (user) не равно base64. "user":"-"

jq: error (at <stdin>:1): string ("-") is not valid base64 data

Как я могу получить полностью измененный json и избежать модификации, если пользовательское значение не содержит «Basic»?

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
0
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте if ... then ... else ... end для реализации различных действий в зависимости от значения.

jq '.user |= if startswith("Basic ")
             then .[6:] | @base64d
             else . end
  ' file.json

Спасибо, это работа. Кстати, как я могу настроить несколько строк в startwith? Я заметил, что некоторые значения идут с basic, а не Basic в начале

Dargod 07.04.2022 17:22

Вы можете использовать if startswith("Basic ") or startswith("basic ") или if test("^[Bb]asic ").

choroba 07.04.2022 17:28

Другие вопросы по теме