#json #bash
#json #bash
Вопрос:
У меня есть 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
Ответ №1:
$ jq '[ path(..) | join(".") ] | del(.[0])' /tmp/2.json
[
"foo",
"zuzu",
"zuzu.lele",
"eita",
"eita.0",
"eita.0.oxe"
]
Примечания:
cat file | jq
бесполезное использованиеcat
. Dojq ... file
- чтобы преобразовать в массив bash, используйте обычную
readarray -t arr < <(jq -r ....)
jq
имеет довольно эффективный язык программирования. Сначала попробуйте решить проблемы вjq
.