Shell - jq:将 `keys.childkeys` 的 json 列表转换为列表列表
Shell - jq: Turning json list of `keys.childkeys` into list of lists
我正在使用 jq 来解析 json file
。这是 jq
:
的当前输出
[
"key1.childk2",
"key2.childk3"
]
我想将它变成可读的 json 格式本身,如下所示:
[
["key1","childk2"],
["key2","childk3"]
]
理想情况下,我更愿意使用 jq
来执行此操作,但是任何其他可以处理 shell 变量的 shell 工具都是公平的游戏。
使用 jq,您可以使用像 map(./".")
这样的简单过滤器 结构化地 将输入转换为您想要的 JSON 文档,但是对于所请求的 可读性,输出不会完全符合您想要的格式。
如果没有任何进一步的标志,jq 将 pretty-print 输出为:
[
[
"key1",
"childk2"
],
[
"key2",
"childk3"
]
]
使用 --compact-output
或 -c
标志会将整个 JSON 文档压缩成一行,而不仅仅是外部数组的元素:
[["key1","childk2"],["key2","childk3"]]
所以,如果您真的想要,您也可以自己将这些部分粘在一起,因为您希望它们在 jq 中格式化,但老实说,我不鼓励您这样做是为了绕过 jq 的内部 JSON 作曲家,你最终可能会输出无效的 JSON.
jq -r '"[", " " + (map(./"." | tojson) | .[:-1][] += ",")[], "]"'
[
["key1","childk2"],
["key2","childk3"]
]
您可以使用 jq split
过滤器:
jq '[.[] | split(".")]'
[
[
"key1",
"childk2"
],
[
"key2",
"childk3"
]
]
你应该在原始 jq 命令的某处使用它
这里有一个 ruby
可以做到这一点:
ruby -r json -e 'puts JSON.parse($<.read).map{|e| e.split(".")}.to_json' file
[["key1","childk2"],["key2","childk3"]]
或者如果你想要漂亮:
ruby -r json -e 'puts JSON.pretty_generate(
JSON.parse($<.read).map{|e| e.split(".")})
' file
[
[
"key1",
"childk2"
],
[
"key2",
"childk3"
]
]
或者您可以生成 精确 格式:
ruby -r json -e '
l=[]
JSON.parse($<.read).map{|e| l << e.split(".").to_s}
puts "[\n\t#{l.join(",\n\t")}\n]"
' file
[
["key1", "childk2"],
["key2", "childk3"]
]
我正在使用 jq 来解析 json file
。这是 jq
:
[
"key1.childk2",
"key2.childk3"
]
我想将它变成可读的 json 格式本身,如下所示:
[
["key1","childk2"],
["key2","childk3"]
]
理想情况下,我更愿意使用 jq
来执行此操作,但是任何其他可以处理 shell 变量的 shell 工具都是公平的游戏。
使用 jq,您可以使用像 map(./".")
这样的简单过滤器 结构化地 将输入转换为您想要的 JSON 文档,但是对于所请求的 可读性,输出不会完全符合您想要的格式。
如果没有任何进一步的标志,jq 将 pretty-print 输出为:
[
[
"key1",
"childk2"
],
[
"key2",
"childk3"
]
]
使用 --compact-output
或 -c
标志会将整个 JSON 文档压缩成一行,而不仅仅是外部数组的元素:
[["key1","childk2"],["key2","childk3"]]
所以,如果您真的想要,您也可以自己将这些部分粘在一起,因为您希望它们在 jq 中格式化,但老实说,我不鼓励您这样做是为了绕过 jq 的内部 JSON 作曲家,你最终可能会输出无效的 JSON.
jq -r '"[", " " + (map(./"." | tojson) | .[:-1][] += ",")[], "]"'
[
["key1","childk2"],
["key2","childk3"]
]
您可以使用 jq split
过滤器:
jq '[.[] | split(".")]'
[
[
"key1",
"childk2"
],
[
"key2",
"childk3"
]
]
你应该在原始 jq 命令的某处使用它
这里有一个 ruby
可以做到这一点:
ruby -r json -e 'puts JSON.parse($<.read).map{|e| e.split(".")}.to_json' file
[["key1","childk2"],["key2","childk3"]]
或者如果你想要漂亮:
ruby -r json -e 'puts JSON.pretty_generate(
JSON.parse($<.read).map{|e| e.split(".")})
' file
[
[
"key1",
"childk2"
],
[
"key2",
"childk3"
]
]
或者您可以生成 精确 格式:
ruby -r json -e '
l=[]
JSON.parse($<.read).map{|e| l << e.split(".").to_s}
puts "[\n\t#{l.join(",\n\t")}\n]"
' file
[
["key1", "childk2"],
["key2", "childk3"]
]