如何使用 jq 漂亮地打印,以便多个值在同一行上?

How to pretty print using jq, so that multiple values are on the same line?

我从jq得到的是:

{
  "frameGrid": {
    "size": [
      24,
      24
    ],
    "dimensions": [
      1,
      1
    ],
    "names": [
      [
        "default"
      ]
    ]
  }
}

我想看到的是这样的:

{
  "frameGrid": {
    "size": [24,24], 
    "dimensions": [1,1],
    "names": [["default"]]
  }
}

我知道这两种形式都有效,并且 jq 具有 compact/pretty 打印模式。但是中间有什么东西吗?我希望以某种方式格式化一个更大的 json 文件,该文件具有比这更多的数组值,以便它易于阅读和打印。也许我只是在这项工作中使用了错误的工具?

(请原谅可怕的格式选择。似乎代码示例不太喜欢 json 格式)

虽然如果您的 json 不太复杂,最好使用 peak 建议的工具,但您可以使用第二个 jq 调用对第一个的输出进行后处理。例如,如果您的数据位于 data.json

$ jq -M . data.json | jq -MRsr 'gsub("\n      +";"")|gsub("\n    ]";"]")'

生产

{
  "frameGrid": {
    "size": [24,24],
    "dimensions": [1,1],
    "names": [["default"]]
  }
}

如@jq170727 所述,jq(例如 jq .)的漂亮打印 运行 后的后处理值得考虑。在这种情况下,这里有一个可能就足够的 awk 脚本:

#!/bin/bash

awk '
  function ltrim(x) { sub(/^[ \t]*/, "", x); return x; }
  s && NF > 1 && $NF == "["  { s=s [=10=];               next}
  s && NF == 1 &&  == "]," { print s "],";   s=""; next}
  s && NF == 1 &&  == "["  { print s;        s=[=10=]; next}
  s && NF == 1 &&  == "{"  { print s; print; s=""; next}
  s && NF == 1 &&  == "]"  { print s ;     s=""; next}
  s && NF == 1 &&  == "}"  { print s;        s=[=10=]; next}
  s                          { s=s ltrim([=10=]);        next}
  $NF == "["                 { s=[=10=];                 next}
  {print}
'

例子

使用示例输入,调用:

 jq . example.json | ./pp

产生:

{
  "frameGrid": {
    "size": [24,24],
    "dimensions": [1,1],
    "names": [
      ["default"]
    ]
  }
}

调用:

jq -n '{a:[1,2,3,[1,2,3,4]],b:2,c:{d:[1,2,{e:[3,4]}]}}' | ./pp

产生:

{
  "a": [1,2,3,
    [1,2,3,4]
  ],
  "b": 2,
  "c": {
    "d": [1,2,
      {
        "e": [3,4]
      }
    ]
  }
}

如果你没有和jq结婚,看看FracturedJson。有一个 web-based 格式化程序、一个命令行应用程序和几个库。

FracturedJson 内联 arrays/objects 只要它们既不太长也不太复杂(根据您的设置)。它也可以将数组做成多行,每行有多个项目,同样,如果它们不是太复杂的话。否则它会以经典的缩进形式分解内容。

这里是使用默认设置的原始问题的数据:

{
    "frameGrid": {
        "size": [24, 24],
        "dimensions": [1, 1],
        "names": [ ["default"] ]
    }
}

披露:我是 FracturedJson 的作者。它是 MIT 许可证下的开源软件。