首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时允许省略jq中的点过滤器?

问何时允许省略jq中的点过滤器?
EN

Stack Overflow用户
提问于 2016-10-28 08:52:53
回答 2查看 280关注 0票数 1

我不明白,什么时候允许省略点表达式。

可以将每一行原始输入转换为JSON字符串:

代码语言:javascript
复制
$ echo -e "a\nb" | jq -Rc . 
"a"
"b"

在该示例中,当缺少点表达式时,它没有任何区别:

代码语言:javascript
复制
$ echo -e "a\nb" | jq -Rc 
"a"
"b"

接下来,我可以读取第一个jq的输出并将其放入一个数组中:

代码语言:javascript
复制
$ echo -e "a\nb" | jq -Rc . | jq -sc .
["a","b"]

在这里,当我省略点表达式时,它也没有什么区别:

代码语言:javascript
复制
$ echo -e "a\nb" | jq -Rc . | jq -sc  
["a","b"]

但是,当我省略这两个点表达式时,结果会得到一个用法错误和一个空数组:

代码语言:javascript
复制
$ echo -e "a\nb" | jq -Rc | jq -sc 
jq - commandline JSON processor [version 1.5]
Usage: jq [options] <jq filter> [file...]
...
[]

为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-28 09:45:01

在直接回答问题之前,我想澄清如下:

  1. 显式指定筛选器总是可以接受的。
  2. jq的某些版本期望显式地指定筛选器。
  3. 在没有显式筛选器的情况下,不同版本的jq的行为不同。

指导jq在智能解释缺乏过滤器方面的主要思想是,如果在STDIN上有什么可读的东西,如果没有明确指定过滤器,如果它看起来像是.,那么假设您指的是.。

因此,问题的答案是,问题中注意到的令人困惑的行为是特定版本的jq中的一个bug。

(或者,如果你愿意的话,这种令人困惑的行为反映了当开发人员试图赋予软件阅读思维的能力时所出现的困难。)

顺便说一下,这个bug已经修复了:

代码语言:javascript
复制
$ jq --version
jq-1.5rc2-150-g1740fd0

$ echo -e "a\nb" | jq -Rc | jq -sc 
["a","b"]
票数 3
EN

Stack Overflow用户

发布于 2016-10-28 09:06:17

答案在课文的其余部分。

Usage: jq [options] <jq filter> [file...]

过滤器应该是强制性的,一个过滤器接受一个输入并产生一个输出,但是在很多时候,您不需要生成一个输出,只希望结果被打印出来,所以默认的结果是. (请参阅在1.5中引入的问题信念,在您必须包含这个过滤器之前)

因此,如果.是默认的筛选,不幸的是,管道读取stdin和stout的方式应该是相同的。您可以阅读GitHub问题中的详细信息。

也许我们应该只在程序为空时打印使用信息,而stdin和stdout都是终端?也就是说,假设。当stdin不是终端或stdout不是终端时。

所以规则是:

  • 如果你想成为完美主义者,一定要使用过滤器,即使.是你想要的过滤器。
  • 如果要将命令的结果作为另一个管道的输入,则必须指示筛选器,如果只希望将相同的结果作为下一个命令的输入。

所以同样的

echo -e "a\nb" | jq -Rc > test.txt会产生一个错误,但是echo -e "a\nb" | jq -Rc . > test.txt会将命令的结果写入文件中。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40301450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档