json - Bash 列出所有 json 路径
问题描述
我有一个json
文件,我想列出上面的所有路径。例如:appsettings.json 文件:
{
"foo": "bar",
"zuzu": {
"lele": "lala"
},
"eita": [
{
"oxe": "right"
}
]
}
预期的结果是一个包含(作为 bash 变量)的数组:
[
"foo",
"zulu",
"zuzu.lele",
"eita",
"eita.0",
"eita.0.oxe"
]
我已经尝试了以下方法,jq
但我无法迭代jq
结果,我一无所知。
#!/bin/bash
join() {
# $1 is return variable name
# $2 is sep
# $3... are the elements to join
local retname=$1 sep=$2 ret=$3
shift 3 || shift $(($#))
printf -v "$retname" "%s" "$ret${@/#/$sep}"
}
jsonPaths=$(cat j.json | jq 'path(..)')
for path in $jsonPaths; do
join pathString "." "${path[@]}"
echo $path
done
解决方案
$ jq '[ path(..) | join(".") ] | del(.[0])' /tmp/2.json
[
"foo",
"zuzu",
"zuzu.lele",
"eita",
"eita.0",
"eita.0.oxe"
]
笔记:
cat file | jq
是无用的使用cat
。做jq ... file
- 要转换为 bash 数组,请使用通常的
readarray -t arr < <(jq -r ....)
jq
拥有相当强大的编程语言。首先尝试解决中的问题jq
。
推荐阅读
- keras - 有没有办法在 Keras 的推理过程中激活 dropout,同时冻结批处理规范层
- r - 优化函数中的起始值问题
- javascript - 如何仅在 Rollup.js 编译时获取一个文件夹的文件列表?
- json - 如何使用 jq 将 for 循环的所有输出合并到单个 json 中
- python - List passed as an input to a recursive function acts like a global in that function rather than a local
- django - 找不到 django 页面 - 当前路径 users/login/ 与其中任何一个都不匹配
- angular - 来自 CDN 的 Sprite.svg 文件链接在角度不起作用?
- haskell - 克隆羊类型应该如何构建
- angular - 如何使用其 ID 删除 Firebase/Firestore 集合中的文档?
- signals - 忽略信号是什么意思?