jq 1.7
After a five year hiatus we're back with a GitHub organization, with new admins and new maintainers who have brought a great deal of energy to make a long-awaited and long-needed new release. We're very grateful for all the new owners, admins, and maintainers. Special thanks go to Owen Ou (@owenthereal) for pushing to set up a new GitHub organization for jq, Stephen Dolan (@stedolan) for transferring the jq repository to the new organization, @itchyny for doing a great deal of work to get the release done, Mattias Wadman (@wader) and Emanuele Torre (@emanuele6) for many PRs and code reviews. Many others also contributed PRs, issues, and code reviews as well, and you can find their contributions in the Git log and on the closed issues and PRs page.
What's Changed
Since the last stable release many things have happened:
- jq now lives at https://github.com/jqlang
- New maintainers, admins, and owners have been recruited.
- A list of current maintainers
- NEWS file is replaced by NEWS.md with Markdown format. @wader #2599
- CI, scan builds, release, website builds etc now use GitHub actions. @owenthereal @wader @itchyny #2596 #2603 #2620 #2723
- Lots of documentation improvements and fixes.
- Website updated with new section search box, better section ids for linking, dark mode, etc. @itchyny #2628
- Release builds for:
- Linux
amd64,arm64,armel,armhf,i386,mips,mips64,mips64el,mips64r6,mips64r6el,mipsel,mipsr6,mipsr6el,powerpc,ppc64el,riscv64ands390x - macOS
amd64andarm64 - Windows
i386andamd64 - Docker
linux/386,linux/amd64,linux/arm64,linux/mips64le,linux/ppc64le,linux/riscv64andlinux/s390x - More details see @owenthereal #2665
- Linux
- Docker images are now available from
ghcr.io/jqlang/jqinstead of Docker Hub. @itchyny #2652 #2686 - OSS-fuzz. @DavidKorczynski #2760 #2762
Full commit log can be found at https://github.com/jqlang/jq/compare/jq-1.6...jq-1.7 but here are some highlights:
CLI changes
-
Make object key color configurable using
JQ_COLORSenvironment variable. @itchyny @haguenau @ericpruitt #2703# this would make "field" bold yellow (`1;33`, the last value) $ JQ_COLORS="0;90:0;37:0;37:0;37:0;32:1;37:1;37:1;33" ./jq -n '{field: 123}' { "field": 123 } -
Change the default color of null to Bright Black. @itchyny #2824
-
Respect
NO_COLORenvironment variable to disable color output. See https://no-color.org for details. @itchyny #2728 -
Improved
--helpoutput. Now mentions all options and nicer order. @itchyny @wader #2747 #2766 #2799 -
Fix multiple issues of exit code using
--exit-code/-eoption. @ryo1kato #1697# true-ish last output value exits with zero $ jq -ne true ; echo $? true 0 # false-ish last output value (false and null) exits with 1 $ jq -ne false ; echo $? false 1 # no output value exists with 4 $ jq -ne empty ; echo $? 4 -
Add
--binary/-bon Windows for binary output. To get\ninstead of\r\nline endings. @nicowilliams 0dab2b1 -
Add
--raw-output0for NUL (zero byte) separated output. @asottile @pabs3 @itchyny #1990 #2235 #2684# will output a zero byte after each output $ jq -n --raw-output0 '1,2,3' | xxd 00000000: 3100 3200 3300 1.2.3. # can be used with xargs -0 $ jq -n --raw-output0 '"a","b","c"' | xargs -0 -n1 a b c $ jq -n --raw-output0 '"a b c", "d\ne\nf"' | xargs -0 printf '[%s]\n' [a b c] [d e f] # can be used with read -d '' $ while IFS= read -r -d '' json; do > jq '.name' <<< "$json" > done < <(jq -n --raw-output0 '{name:"a b c"},{name:"d\ne\nf"}') "a b c" "d\ne\nf" # also it's an error to output a string containing a NUL when using NUL separator $ jq -n --raw-output0 '"\u0000"' jq: error (at <unknown>): Cannot dump a string containing NUL with --raw-output0 option -
Fix assert crash and validate JSON for
--jsonarg. @wader #2658 -
Remove deprecated
--argfileoption. @itchyny #2768 -
Enable stack protection. @nicowilliams #2801
Language changes
-
Use decimal number literals to preserve precision. Comparison operations respects precision but arithmetic operations might truncate. @leonid-s-usov #1752
# precision is preserved $ echo '100000000000000000' | jq . 100000000000000000 # comparison respects precision (this is false in JavaScript) $ jq -n '100000000000000000 < 100000000000000001' true # sort/0 works $ jq -n -c '[100000000000000001, 100000000000000003, 100000000000000004, 100000000000000002] | sort' [100000000000000001,100000000000000002,100000000000000003,100000000000000004] # arithmetic operations might truncate (same as JavaScript) $ jq -n '100000000000000000 + 10' 100000000000000020 -
Adds new builtin
pick(stream)to emit a projection of the input object or array. @pkoppstein #2656 #2779$ jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | pick(.a, .b.c, .x)' { "a": 1, "b": { "c": 2 }, "x": null } -
Adds new builtin
debug(msgs)that works likedebugbut applies a filter on the input before writing to stderr. @pkoppstein #2710$ 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 } -
Adds new builtin
scan($re; $flags). Was documented but not implemented. @itchyny #1961# look for pattern "ab" in "abAB" ignoring casing $ jq -n '"abAB" | scan("ab"; "i")' "ab" "AB" -
Adds new builtin
absto get absolute value. This potentially allows the literal value of numbers to be preserved aslengthandfabsconvert to float. @pkoppstein #2767 -
Allow
ifwithoutelse-branch. When skipped theelse-branch will be.(identity). @chancez @wader #1825 #2481# 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 -
Allow use of
$bindingas key in object literals. @nicowilliams 8ea4a55$ jq -n '"a" as $key | {$key: 123}' { "a": 123 } # previously parentheses were needed $ jq -n '"a" as $key | {($key): 123}' { "a": 123 }
Full Changelog: https://github.com/jqlang/jq/compare/jq-1.7rc2...jq-1.7