jq:限制复数中的所有数组 json

jq: limitting all arrays in a complex json

正在尝试以下代码:

echo '["a","b","c","d","e"]' | jq '..|= if type == "array" then [limit(3;.[])] else . end'
[
  "a",
  "b",
  "c",
  null,
  null
]

期望它生成短数组:

[
  "a",
  "b",
  "c"
]

我使用的 JSON 又大又复杂。我的目标是将所有数组的长度缩小到 3。我得到的是具有大量空值的原始长度数组。

想法?

如果虽然整体结构可能很复杂,但数组的数量和排列并不复杂(例如,没有数组本身是另一个数组中高于 3 的项等),您可以简单地解决“所有数组”并将它们彼此独立地缩短:

(.. | arrays) |= .[:3]

但是,如果您需要涵盖这些特殊情况,walk 会更合适,因为它按顺序下降文档树,因此不会在截断后留下悬空部分:

walk(if type == "array" then .[:3] else . end)