在bash中将行转换为json

时间:2014-10-09 20:10:06

标签: bash jq

我想将列表转换为JSON数组。我正在查看jq,但示例主要是解析JSON(不创建它)。知道正确的逃逸会很愉快。我的列表是单行元素,因此新行可能是最佳分隔符。

5 个答案:

答案 0 :(得分:22)

我还试图将一堆行转换为JSON数组,并且处于停顿状态,直到我意识到-s是我jq一次只能处理多行的唯一方法jq -R -s -c 'split("\n")' < just_lines.txt 1}}表达式,即使这意味着我必须手动解析换行符。

-R
  • -s阅读原始输入
  • -c将所有输入读作单个字符串
  • jq不能打印输出

轻松自负。

编辑:我在split≥1.4,这显然是在引入{{1}}内置时。

答案 1 :(得分:7)

您还可以使用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"]

答案 2 :(得分:3)

- raw-input,然后是--slurp

只是总结其他人所说的内容,希望能更快地理解形式:

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.

答案 3 :(得分:2)

我在jq的man页面中找到并通过实验在我看来是一个更简单的答案。

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

-R是在不尝试解析json的情况下读取,-s表示将所有输入读作一个字符串,而-c用于单行输出 - 不是必需的,但它是什么我在找。

然后在字符串中我传递给jq,&#39;。&#39;说按原样输入。 &#39; / \ n&#39;说要在换行符上划分字符串(拆分)。 &#39; - [&#34;&#34;]&#39;说从结果数组中删除任何空字符串(由最后一个额外的换行符产生)。

它是一行,没有任何复杂的结构,只使用简单的内置jq功能。

答案 4 :(得分:0)

更新:如果您的jq有library(ggplot2) library(purrr) species_list = unique(Iris$Species) species_plot = function(x,y) { ggplot(data = Iris,colour = Species, aes_string(x=x,y=y)) + geom_point(shape = 21, aes(fill = Species),colour = "black", size =8) } species_bins = map(species_list, ~species_plot("sepal_length", "sepal_width") ) ,您可以简单地写:

inputs

产生一个JSON字符串数组。