Мне нужно декодировать значение авторизации из 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»?
Используйте if ... then ... else ... end
для реализации различных действий в зависимости от значения.
jq '.user |= if startswith("Basic ")
then .[6:] | @base64d
else . end
' file.json
Вы можете использовать if startswith("Basic ") or startswith("basic ")
или if test("^[Bb]asic ")
.
Спасибо, это работа. Кстати, как я могу настроить несколько строк в startwith? Я заметил, что некоторые значения идут с
basic
, а неBasic
в начале