如何使用 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 许可证下的开源软件。
我从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 许可证下的开源软件。