首页 > 解决方案 > 使用 jq 将带有换行符的文本文件转换为 json

问题描述

我已经看到了很多使用 jq 将文本文件转换为 json 的示例,但我遇到了一些可能很明显的问题。我的输入文件具有以下格式:

key1: string1
key2: string1

key1: string3
key2: string3

我怎样才能把它翻译成:

[
  {"key1":"string1", "key2": "string2"},
  {"key1":"string3", "key2": "string4"}
]

我尝试inputs与 jq 一起使用,例如jq -R -n -c '[inputs|split(":")|{(.[0]):.[1]}] | add',但只要文件中有换行符,它就会失败:

jq: error (at result.txt:8): Cannot use null (null) as object key.

谢谢

标签: jsonshelljq

解决方案


由于减少被广泛理解,这是一个reduce基于简单的解决方案,它不需要在 key:value 行组之间换行。也就是说,在构造数组时,一旦遇到前一个对象中出现的键,就会启动一个新对象。

< input.txt jq -nR '
  reduce (inputs
          | select(length > 0) 
          | capture("(?<k>^[^:]*): *(?<v>.*)") 
          | {(.k):.v}) as $in (null;
    if . == null then [$in] 
    elif (.[-1] | has($in|keys_unsorted[0])) then . + [$in] 
    else .[-1] += $in end)'

推荐阅读