Json
限制jq的輸出深度
我想使用
jq
. 為此,我想限制jq
下降到文件的深度,並且只向我顯示第一個n
,例如 3 個級別。假設我有以下 JSON 文件:
{ "a": { "b": { "c": { "d": { "e": "foo" } } } }, "f": { "g": { "h": { "i": { "j": "bar" } } } }, "k": { "l": { "m": { "n": { "o": "baz" } } } } }
我期待結果
{ "a": { "b": { "c": {} } }, "f": { "g": { "h": {} } }, "k": { "l": { "m": {} } } }
如果我事先知道文件的結構,這是一個相當簡單的任務,但我經常不知道。這就是為什麼我希望能夠
jq
只顯示文件結構的前 n 級,這可能是字典和數組的任意嵌套。一個更複雜的例子可能是:
[ { "a": { "b": { "c": { "d": { "e": "foo"}}}}}, { "f": [ { "g": "foo"}]}, [ "h", "i", "j" ] ]
我期望的結果
[ { "a": { "b": {}}, { "f": [{}]}, [ "h", "i", "j" ] ]
我可以
jq
這樣做嗎?
將該
del
函式與.[]?
數組/對象值迭代器相結合以刪除嵌套在第四層的任何鍵/值似乎給出了您正在尋找的結果:$ jq 'del(.[]?[]?[]?[]?)' <<'EOT' [ { "a": { "b": { "c": { "d": { "e": "foo"}}}}}, { "f": [ { "g": "foo"}]}, [ "h", "i", "j" ] ] EOT [ { "a": { "b": {} } }, { "f": [ {} ] }, [ "h", "i", "j" ] ]
需要迭代器過濾器的
.[]?
版本.[]
來防止jq
在嘗試迭代不是數組或對象的項目時抱怨。老實說,我
.[][]
在文件中的任何地方都找不到上面顯示的形式(基本上是:)的數組/對象迭代器過濾器的任何直接提及。一個不太簡潔但記錄清楚的版本是:$ jq 'del(.[]? | .[]? | .[]? | .[]?)' ...