jq 1.7 リリース
(github.com/jqlang)- サポート終了となっていた
--argfileオプション とleaf_paths、recurse_downフィルタが削除 - Docker イメージは Docker Hub ではなく
ghcr.io/jqlang/jqで提供 - リリースビルド対象として Linux、macOS、Windows と Docker の複数アーキテクチャを明記
--raw-output0が追加され、出力の間に NUL バイト を挿入できるようになり、NUL を含む文字列の出力はエラーとして処理- Windows では
--binary/-bオプションが追加され、\r\nではなく\nの改行末尾を出力可能に JQ_COLORSでオブジェクトキーの色を設定でき、NO_COLOR環境変数を尊重して色付き出力を無効化--exit-code/-eオプションの終了コード問題を修正し、最後の出力値が真なら 0、falseまたはnullなら 1、出力がない場合は 4 を返す- 数値リテラルの 精度保持 のため 10 進数値リテラルを使用し、比較演算は精度を尊重するが算術演算では切り捨てられる可能性あり
- 新しい組み込み関数
pick(stream)、debug(msgs)、scan($re; $flags)、absを追加 if文ではelse分岐を省略でき、省略されたelseは.の動作として扱われるhaltとhalt_errorは次の入力へ進まず即時終了するように変更- 一部プラットフォームで大きな数値表現が誤った JSON 出力を生成していた問題、libjq とスレッド使用時のセグメンテーションエラー、
--jsonargの assert クラッシュを修正 - CI、スキャンビルド、リリース、Web サイトビルドが GitHub Actions を使うように変更され、OSS-Fuzz を追加
1件のコメント
Hacker News の意見
JQ が素晴らしくて本当に気に入っている
私たちの製品(JVM およびブラウザベースの Kafka ツール)では、ユーザーがデータを加工/フィルタリングできるよう、Clojure で JQ のサブセットを実装した。これまで書いたコードの中でも特に楽しい作業の一つで、もともと文法を書くのが好きなこともあり、Instaparse にも大いに感謝している: https://github.com/Engelberg/instaparse
実装しているうちに JQ が LISP-2 だと分かったのだが、文法を見ただけではそう感じられず驚いた: https://github.com/jqlang/jq/wiki/jq-Language-Description#:~...
ただ、直感的でないクエリ構文、ごく小さなステップごとに検索しなければならないこと、そしてその結果が jq の専門家でなければ解読しにくい呪文のようになることが気にかかる。htmx や tailwind のように、文字列の中に埋め込まれる DSL 全般に本能的な抵抗感がある
それでも、よく作られたソフトウェアであり、時にはより良い選択肢がないことも認める。JSON を bash で扱うときには、sed/awk/cut の怪物よりはるかにましという意味で、最もましな選択肢でもある。ただ、スクリプトの真ん中にいつも解読不能な文字列のように埋まっている jq コマンドは、正規表現と並んでコード内で見たくないものに近い。代替として heredoc 内の inline Python をパイプで渡したこともあるが、それも jq スクリプトと同じくらいごちゃごちゃになる
例から "Jq parser (partially working)" を選んで "Parse" を押すと、"Input source" のソースに対するパーサーツリーを見られる。フィードバックはいつでも歓迎
jq は大半のケースを単純にし(実質的には JSON のドット記法)、ロングテールの複雑なケースも可能にしてくれる
jq は好きだが、JMESPath(特に AWS CLI と一緒に)、yq(tomlq と xq も含む)、dasel も併用している。hclq が事実上死んでいるのは残念
https://jmespath.org/
https://kislyuk.github.io/yq/
https://github.com/TomWright/dasel
https://hclq.sh/
もう何年も
jqを使っていて、必要なものはいつも何とか組み合わせて作れているが、それでも直感的だと感じたことはない。少し複雑になるだけで、ドキュメントを長く読まずに解法へたどり着くのは難しく、もっと簡単に使えるとよいと思う最初に文法を学ぶときに役立ったし、今でも変な構文で引っかかるとまた見に行く
最大の用途は、CSV、TOML、XML のようなものを JSON に変換して jq にパイプすること: https://github.com/sentriz/rsl
https://github.com/kellyjonbrazil/jello
https://github.com/wwkimball/yamlpath
XPath に着想を得ているので、完全に新しい DSL よりなじみがあり、中心的な機能は再帰的なキー検索だと思う。
people..addressと書けば、JSON のどこにあっても "people" の下にあるすべての "address" キーを見つけてくれる。JSON 用のパース言語の中で一番好きで、JSON データセットのパースに使う方法を紹介する記事も書いたhttps://github.com/JSONPath-Plus/JSONPath
https://scrapfly.io/blog/parse-json-jsonpath-python/
jqをたまにしか使わず、毎回ドキュメントを見る必要があるなら gron を試す価値がある。grep 可能な JSON
https://github.com/tomnomnom/gron
何年も
curl cheat.sh/jqを使ってきたし、cheat.sh 全体が優れた資料だと思う。今ならおそらく ChatGPT のようなものを使うと思うgron | grep | sed | gron -uのような使い方も可能jqを好きでいられる、あるいは我慢できる理由の一つは 安定性。数年前に書いたスクリプトが今でも同じように動く
一方で yq 用に置いていたコードは、yq が後方互換性のない形で改善され続けたため、よく壊れた。そうした変更がどれほど頻繁にあったのかは調べていないが、CI スクリプトのように基本ツールのバージョンがまちまちで、更新ペースも異なる環境で何度も影響を受けた
だから jq のメンテナーたちが 後方互換性 の重要性を理解してくれていることには、いつも感謝していた。今回の発表が、その安定性は単に停滞の偶然の副産物であり、停滞を解消するために安定性を犠牲にする、という意味でないことを願う
https://kislyuk.github.io/yq/
https://github.com/kyle-long/yq#yq
https://github.com/up1/yq-1#yq-command-line-yamlxml-processo...
https://github.com/onixspot/yq-2#yq-command-line-yamlxmltoml...
https://github.com/simonrupf/convert2json#convert2json
jq に似たツールに加えて、jq と一緒に使う興味深いツールとして jo と jc がある
https://github.com/jpmens/jo
https://github.com/kellyjonbrazil/jc
gron はここで初めて聞いたが、網羅性のために付け加える。一方で JSON は CLI ツールの標準出力形式のようになりつつあるようだ。理想的には、すべての CLI ツールが
--jsonのようなフラグを提供し、jc が不要になることhttps://jless.io/
https://github.com/tomnomnom/gron
先月の関連記事「First release of jq in 5 years」: https://news.ycombinator.com/item?id=36951830
jq の熱烈なファンで、いつも使っている
ついに来た
コミュニティが力を合わせて新しいメンテナーを募り、プロジェクトを復活させた過程は本当に素晴らしい。特に GitHub ユーザー名で @stedolan、@itchyny、@owenthereal に特別な感謝を
jq と miller は awk、vim と並んで自分の道具箱の必需品
https://github.com/johnkerl/miller
新しい組み込み関数
pick(stream)が、入力オブジェクトや配列の射影を出力する機能を追加したjq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | pick(.a, .b.c, .x)'これは本当に救世主のような機能。コントリビューターに感謝
$ jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | {a, e}'{"a": 1,"e": 4}pickバージョンがあるとよいjaq もおすすめしたい。正確性、速度、単純さに重点を置いた jq クローン
jq のサブセットだけを実装しているが、これまでかなり満足して使っている: https://github.com/01mf02/jaq