什么时候允许省略jq中的点过滤器?

时间:2016-10-28 08:52:53

标签: jq

我不明白,当它被允许省略点表达式时。

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

<div v-on:ChangeView="doSomething"></div>

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

$ echo -e "a\nb" | jq -Rc . 
"a"
"b"

接下来,我可以读取第一个$ echo -e "a\nb" | jq -Rc "a" "b" 的输出并将其插入数组:

jq

当我省略点表达式时,这也没有区别:

$ echo -e "a\nb" | jq -Rc . | jq -sc .
["a","b"]

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

$ echo -e "a\nb" | jq -Rc . | jq -sc  
["a","b"]

为什么?

2 个答案:

答案 0 :(得分:3)

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

  1. 明确指定过滤器总是可以接受的。
  2. 某些版本的jq期望明确指定过滤器。
  3. 在没有显式过滤器的情况下,不同版本的jq表现不同。
  4. 在智能上解释缺少过滤器时,指导jq演变的主要思想是,如果在STDIN上读取某些内容,并且未明确指定过滤器,并且看起来你的意思是.,然后假设你的意思是.

    问题的答案是,问题中提到的令人困惑的行为是特定版本的jq中的错误。

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

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

    $ jq --version
    jq-1.5rc2-150-g1740fd0
    
    $ echo -e "a\nb" | jq -Rc | jq -sc 
    ["a","b"]
    

答案 1 :(得分:-1)

答案在文本的其余部分

  

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

过滤器应该是必需的,过滤器接受输入并产生输出,但很多时候你不需要产生输出而只想打印结果,所以默认值是.(参见{ {3}}相信在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会将命令的结果写入文件