我不明白,什么时候允许省略点表达式。
可以将每一行原始输入转换为JSON字符串:
$ 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"]但是,当我省略这两个点表达式时,结果会得到一个用法错误和一个空数组:
$ echo -e "a\nb" | jq -Rc | jq -sc
jq - commandline JSON processor [version 1.5]
Usage: jq [options] <jq filter> [file...]
...
[]为什么?
发布于 2016-10-28 09:45:01
在直接回答问题之前,我想澄清如下:
指导jq在智能解释缺乏过滤器方面的主要思想是,如果在STDIN上有什么可读的东西,如果没有明确指定过滤器,如果它看起来像是.,那么假设您指的是.。
因此,问题的答案是,问题中注意到的令人困惑的行为是特定版本的jq中的一个bug。
(或者,如果你愿意的话,这种令人困惑的行为反映了当开发人员试图赋予软件阅读思维的能力时所出现的困难。)
顺便说一下,这个bug已经修复了:
$ jq --version
jq-1.5rc2-150-g1740fd0
$ echo -e "a\nb" | jq -Rc | jq -sc
["a","b"]发布于 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会将命令的结果写入文件中。
https://stackoverflow.com/questions/40301450
复制相似问题