У меня также возникает желание предложить альтернативное решение: полагаться на другую мою утилиту Unix jtc
и некоторые стандартные Unix Cli:
Firstпример и затем объяснение (при условии, что ваш json находится в file.json
):
bash $ jtc -w[:] -eu echo {} \| jtc -rw[:] \| sort \| paste -s -d, - \| sed -E 's/(.*)/[\1]/g' \; file.json
{
"x": [
"g",
"h",
"i"
],
"y": [
"d",
"e",
"f"
],
"z": [
"a",
"b",
"c"
]
}
bash $
Объяснение:
1.jtc
сортирует ключи в объектах JSON по умолчанию.Путь обхода -w[:]
перечисляет все узлы в узле json верхнего уровня (который здесь является объектом):
bash $ jtc -w[:] -r file.json
[ "g", "i", "h" ]
[ "e", "d", "f" ]
[ "c", "b", "a" ]
bash $
2.-u
обновляет (заменяет) каждую входящую запись, тогда как -e
позволяет выполнять оценку оболочки для проходной записи: например, jtc -w[:] -eu <...shell cli...> \; file.json
.Кроме того, каждый экземпляр {}
будет интерполирован с проходной записью.
Таким образом, например, первая пройденная запись ([ "g", "i", "h" ]
) будет интерполирована и оценена следующим образом:
echo '[ "g", "i", "h" ]' | jtc -rw[:] | sort | paste -s -d, - | sed -E 's/(.*)/[\1]/g'
["g","h","i"]
где:
jtc -rw[:]
перечисляет все записи (в каждой строке) sort
сортирует их все paste -s -d, -
связывает все строки назадв одну строку через запятую ,
sed -E 's/(.*)/[\1]/g'
ставит квадратные скобки [
, ]
вокруг отсортированных записей
3.В результате json заменяет пошаговую запись во внешнем jtc
.И затем тот же процесс повторяется для остальных (пройденных) массивов.