7 сентября, после пятилетнего застоя, состоялся выпуск 1.7 библиотеки и консольной утилиты jq, предназначенной для работы с форматом JSON и написанной на языке программирования C. Опционально утилита может быть скомпилирована с использованием библиотеки регулярных выражений Oniguruma.
Изменения:
- новый адрес: https://github.com/jqlang;
- новые сопровождающие, администраторы и владельцы;
- файл NEWS заменен на NEWS.md;
- улучшения CI, документации, тестирования и веб-сайта;
- образы Docker теперь доступны с https://ghcr.io/jqlang/jq вместо Docker Hub;
Изменения в консольной утилите:
- цвет ключа объекта можно настраивать с помощью переменной окружения
JQ_COLORS
; - цвет
null
теперь ярко-черный по умолчанию; - для отключения цвета можно использовать переменную окружения
NO_COLOR
; - улучшен вывод с ключом
--help
: теперь указываются все опции и в более удобном порядке; - добавлен ключ
--raw-output0
для вывода данных с нулевым байтом в качестве разделителя; - удалён ключ
--argfile
; - другие изменения.
Изменения языка запросов:
- для сохранения точности нужно использовать десятичные литералы чисел. Операции сравнения сохраняют точность, но арифметические операции могут усекаться;
- добавлена функция
pick(stream)
для выдачи проекции входного объекта или массива:
$ jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | pick(.a, .b.c, .x)'
{
"a": 1,
"b": {
"c": 2
},
"x": null
}
- добавлена функция
debug(msgs)
, которая работает какdebug
, но применяет фильтр к входным данным перед записью вstderr
:
$ jq -n '1 as $x | 2 | debug("Entering function foo with $x == \($x)", .) | (.+1)'
["DEBUG:","Entering function foo with $x == 1"]
["DEBUG:",2]
3
$ jq -n '{a: 1, b: 2, c: 3} | debug({a, b, sum: (.a+.b)})'
["DEBUG:",{"a":1,"b":2,"sum":3}]
{
"a": 1,
"b": 2,
"c": 3
}
- добавлена функция
scan($re; $flags)
:
# look for pattern "ab" in "abAB" ignoring casing
$ jq -n '"abAB" | scan("ab"; "i")'
"ab"
"AB"
- добавлена функция
abs
для получения абсолютного значения числа; if
можно использовать безelse
:
# convert 1 to "one" otherwise keep as is
$ jq -n '1,2 | if . == 1 then "one" end'
"one"
2
# behaves the same as
$ jq -n '1,2 | if . == 1 then "one" else . end'
"one"
2
# also works with elif
$ jq -n '1,2,3 | if . == 1 then "one" elif . == 2 then "two" end
"one"
"two"
3
- можно использовать
$переменная
в качестве ключа в объектных литералах:
$ jq -n '"a" as $key | {$key: 123}'
{
"a": 123
}
# previously parentheses were needed
$ jq -n '"a" as $key | {($key): 123}'
{
"a": 123
}
- можно использовать точку между индексами в цепочке при использовании
.["index"]
:
$ jq -n '{"a": {"b": 123}} | .a["b"]'
123
# now this also works
$ jq -n '{"a": {"b": 123}} | .a.["b"]'
123
- можно использовать точку для итератора цепочек значений
.[]
и.[]?
:
$ jq -n '{"a": [123]} | .a[]'
123
# now this also works
$ jq -n '{"a": [123]} | .a.[]'
123
- ускорение и рефакторинг некоторых встроенных функций;
- множественные исправления ошибок и другие изменения.
>>> Подробности