2014-10-09 92 views
4

我想將列表轉換爲JSON數組。我正在尋找jq,但這些例子主要是關於解析JSON(而不是創建它)。很高興知道正確的轉義會發生。我的列表是單行元素,因此新行可能是最好的分隔符。在bash中將行轉換爲json

+1

BTW,本 - 1不是我,但如果我不得不猜測爲什麼它在那裏,那可能是「請爲我做我的工作「這個問題(否則有用和值得,因此我的回答)問題發出。顯示你的工作和你試圖解決這個問題的問題可以避免這種情況。 – 2014-10-09 21:53:21

+0

謝謝,是的,我沒有谷歌。我正在尋找一個小的一行,可能是我在'jq'手冊頁中錯過的東西。感謝您的反饋,即投票是我的。 – jcalfee314 2014-10-09 23:42:08

回答

10

我也在嘗試將一串行轉換爲JSON數組,並且處於停頓狀態,直到我意識到-s是我在jq表達式中一次處理多行的唯一方法,即使這意味着我不得不手動解析換行符。

jq -R -s -c 'split("\n")' < just_lines.txt 
  • -R讀取原始輸入
  • -s讀取所有輸入一個字符串
  • -c不漂亮的打印輸出

易peasy。

編輯:我在jq≥1.4,這顯然是當split內置引入。

+0

看起來很簡單..雖然我無法驗證。我在ubuntu jq 1.3版上遇到錯誤'error:split is not defined' – jcalfee314 2015-01-18 16:18:00

+1

不幸的是,'jq'文檔並沒有說每個內置函數何時被引入,'jq --version'也不會告訴我什麼版本我有,但它至少是1.4,用'brew install jq --HEAD'安裝。好點,但我會編輯答案。 – chbrown 2015-01-18 20:15:19

+3

我喜歡這個答案,除了對於具有尾隨換行符(\ n)的多行輸出,'split'內置函數將在數組中產生額外的空字符串項目:(無論如何解決這個問題? – Devy 2016-10-21 15:46:11

3

您還可以使用jq -R .於每行格式化爲JSON字符串,然後jq -s--slurp)以解析它們作爲JSON之後創建用於將輸入線的陣列:

$ printf %s\\n aa bb|jq -R .|jq -s . 
[ 
    "aa", 
    "bb" 
] 

的方法,chbrown的如果輸入一個換行符結束的答案添加到結束的空元素,但是你可以使用printf %s "$(cat)"刪除尾隨換行符:

$ printf %s\\n aa bb|jq -R -s 'split("\n")' 
[ 
    "aa", 
    "bb", 
    "" 
] 
$ printf %s\\n aa bb|printf %s "$(cat)"|jq -R -s 'split("\n")' 
[ 
    "aa", 
    "bb" 
] 

如果輸入線不包含ASCII控制字符(其中有在有效的JSON字符串進行轉義),你可以使用sed

$ printf %s\\n aa bb|sed 's/["\]/\\&/g;s/.*/"&"/;1s/^/[/;$s/$/]/;$!s/$/,/' 
["aa", 
"bb"] 
+0

當從jq到jq的管道輸入時, '漂亮的打印是沒有必要的:'jq -cR。| jq -s .' – ceving 2016-10-27 10:00:59

+1

而不是在一個單獨的調用中sl inputs輸入,只需將原始輸入放入一個數組中''jq -Rn'[inputs]'input.json '。這些都是等價的:'jq -s'。'input.json'和'jq -n'[inputs]'input.json' – 2017-08-10 03:18:52

1

我在man page發現JQ並通過實驗似乎什麼對我來說是一個更簡單的答案。

$ cat test_file.txt | jq -Rsc './"\n" - [""]' 
["aa","bb"] 

的-R是不分析JSON閱讀,與-s說,讀所有的輸入作爲一個字符串,和-c是一個行輸出 - 沒有必要的,但它是什麼我在尋找。

然後在字符串我傳遞給jq,'。'說按原樣進行輸入。 '/ \ n'表示在換行符上劃分字符串(將其拆分)。 ' - [「」]'表示從結果數組中刪除任何空字符串(在最後一個額外的換行符導致)。

這是一條線,沒有任何複雜的構造,只使用簡單的內置jq功能。

1

只是總結一下別人的希望更快地瞭解表格說:

cat /etc/hosts | jq --raw-input . | jq --slurp . 

將返回:

[ 
    "fe00::0 ip6-localnet", 
    "ff00::0 ip6-mcastprefix", 
    "ff02::1 ip6-allnodes", 
    "ff02::2 ip6-allrouters" 
] 

說明

--raw-input/-R: 

     Don´t parse the input as JSON. Instead, each line of text is passed 
     to the filter as a string. If combined with --slurp, then the 
     entire input is passed to the filter as a single long string. 

--slurp/-s: 

     Instead of running the filter for each JSON object in the input, 
     read the entire input stream into a large array and run the filter 
     just once.