如何解决为什么 jq 有时需要过滤器表达式,有时不需要?
我有一些未格式化的 JSON 文件。我想用 jq 格式化它们并通过less查看格式化的输出:
cat *.json | jq | less
但它不起作用。只显示 jq 的帮助。
好的,jq 需要一个过滤器,最少需要一个 .
,但是...
cat *.json | jq
对我有用。
有什么区别?这是一个 Bash 错误,看到解析命令行是 shell 的任务吗?为什么只有 jq 才会出现这种情况?
解决方法
jq
检测到它的输出流是一个终端,它会做一些不同的事情。一方面,它对其输出进行颜色编码(除非您明确关闭该选项)。但与这个问题更相关的是,对于 1.5 版,如果它检测到它的输出流是一个终端,它的输入流不是一个终端,并且根本没有非选项命令行参数,则它假定您打算使用过滤器 .
。
这就是您键入 cat *.json | jq
时发生的情况。在这种情况下,jq 的输入流是一个管道(来自 cat
命令)但它的输出流是终端。因此它假定默认过滤器为 .
。
但是当您通过 jq
管道传输 less
的输出时,jq
的输出流不再是终端。现在它是一个管道(连接到 less
进程)。所以没有插入自动过滤器 .
,jq
抱怨没有提供过滤器。
但是,如果您升级到 v1.6,您会发现行为发生了变化。在 v1.6 中,除非输入流和输出流都是终端,否则不带任何过滤器的调用将调整为 .
。因此,如果您升级,您会发现 cat *.json | jq | less
的工作方式与 cat *.json | jq
大致相同,只是输出是彩色的,当然,不是分页的。
顺便说一句,如果您想使用 less
查看彩色输出(并且您使用的是 Gnu less
),那么您可以使用以下命令:
cat *.json | jq . -C | less -R # The . is not necessary with v1.6
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。