2016-10-28 19 views
0

我不明白,什麼時候可以省略點表達式。允許在jq中省略點過濾器嗎?

是可能的原始輸入的每一行轉換爲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...] 
... 
[] 

爲什麼?

回答

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

所以它應該是相同的,如果.是默認過濾,不幸的是管道是如何讀取標準輸入和粗壯。您可以閱讀GitHub問題中的詳細信息

也許我們應該只在程序爲空時打印使用消息,並且stdin和stdout都是終端?也就是說,假設。當標準輸入不是終端或標準輸出不是終端時。

所以規則是:

  • ,如果你想始終追求完美,如果你希望你的命令的結果爲輸入使用過濾器,即使.是你想
  • 過濾器如果您只想將相同的結果作爲下一個命令的輸入,則必須再次指明過濾器。

所以同樣

echo -e "a\nb" | jq -Rc > test.txt會產生一個錯誤,但echo -e "a\nb" | jq -Rc . > test.txt將命令的結果寫入到文件

+0

不回答問題。問題是:爲什麼有時需要而且有時不需要? – ceving

+0

當您需要將輸入作爲輸出輸入到管道時,它是必需的。 '''什麼也沒有做,它只是_copying jq的輸入到它的輸出unmodified_如果你不需要進一步處理你的命令的結果,你可以省略過濾器,如果你需要將結果作爲另一個命令的輸入過濾器 –