2016-10-28 13 views
0

ドット表現を省略することが許されているとは分かりません。jqでドットフィルタを省略することはできますか?

JSON文字列に生の入力のすべての行を変換することが可能である。その例で

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

ドット表現が欠落しているとき、それは、違いはありません:

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

次I最初の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...] 
... 
[] 

なぜ?

答えて

3
直接質問に答える前に、私はそれを明確にしたいと思い

にコマンドの結果を書きます:

  1. フィルタを明示的に指定することは常に可能です。
  2. jqのいくつかのバージョンでは、フィルタが明示的に指定されることを期待しています。
  3. jqの異なるバージョンでは、明示的なフィルタがないと動作が異なります。

jqの進化の指針は、STDINで読みたいものがあれば、フィルターが明示的に指定されていない場合、 .の場合は、.を意味すると仮定します。

質問に対する答えは、質問に記載されている難解な動作が特定のバージョンのjqのバグだということです。

(またはあなたが好きなら、当惑させる行動は、開発者があなたの心を読む能力とソフトウェアを付与しようとする際に生じる困難を反映しています。)

ところでは、バグが修正されました:

$ jq --version 
jq-1.5rc2-150-g1740fd0 

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

これはバグであることも、私の最初のアイデアでした。しかし、私は 'jq'に精通していないので、私は尋ねました。たぶん魔法のセンスがあるかもしれません。しかし、私が今までに読んだことから、私はどちらの感覚も見つけることができません。 – ceving

-1

答えはテキスト

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

フィルタの残りの部分であるが、その後、必須である必要があり、フィルタは、入力を受け取り、出力を生成しますが、何回であなたが必要性をいけません出力を生成し、その結果が印刷されるようにするには、デフォルト値は.issueが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は、ファイル

+0

質問には答えません。問題は、時には時には必要なのはなぜですか、時にはそうではないのでしょうか? – ceving

+0

パイプへの出力として入力を進める必要があるときに必要です。 '.'は何もしません。jqの入力をそのまま出力にコピーします。コマンドの結果を続行する必要がなければ、フィルタを省略することができます。結果を別のコマンドの入力としてパイプする必要がある場合フィルタ –

関連する問題