news 2026/10/6 1:54:45

jq 数组切片 `[n:m]` 详解:轻松截取数组两端子集

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
jq 数组切片 `[n:m]` 详解:轻松截取数组两端子集
  • 文档
  • 教程
  • 知识库

【免费下载链接】til

:memo: Today I Learned

项目地址:https://gitcode.com/gh_mirrors/ti/til
点击查看免费下载

本篇指南聚焦于 TIL 仓库 jq/get-a-slice-of-the-ends-of-an-array.md 所讲解的 jq 数组切片语法[n:m]:从通用形式出发,完整覆盖「省略边界值取开头」「负索引从末尾倒数取结尾」两大核心用法,并结合仓库内其他 jq 笔记与命令行实操示例,让你在处理 JSON 数组时无需知道数组长度即可精准截取首部或尾部子集。

jq 数组切片语法基础

jq 内置了一套与 Python/Ruby 等语言相似的切片(slice)语法,允许我们从数组(以及字符串)中提取一段连续的子集。通用形式是:

[n:m]

其中:

  • n是切片起始位置的索引,包含(inclusive)该位置的元素;
  • m是切片结束位置的索引,不包含(non-inclusive)该位置的元素。

换句话说,[n:m]取的是「从第n个元素开始、到第m个元素之前(不含第m个)结束」的连续区间。例如对于一个 7 元素的数组,[1:4]会取出索引 1、2、3 三个元素。

当n与m之一被省略时,jq 会使用默认边界:

写法含义
[n:m]从索引n(含)到索引m(不含)
[:m]省略n,等价于[0:m],即从数组开头到索引m(不含)
[n:]省略m,等价于[n:length],即从索引n到数组末尾
[:]等价于[0:length],即整个数组

省略n时默认是0(数组起点);省略m时默认到列表末尾。这正是「取数组两端子集」的语法基础。

取数组开头几个元素:省略起始索引

既然省略n默认从索引0开始,那么.[:m]天然就是「取数组前m个元素」。仓库原文给出的例子如下:

❯ echo '["a","b","c","d","e","f","g"]' | jq '.[:3]' [ "a", "b", "c" ]

这里.[:3]等价于.[0:3],取出的是索引 0、1、2 三个元素。注意索引m=3对应的元素"d"并不会出现在结果中,因为结束索引是不含的。

这种写法非常适合在调试大 JSON 时快速「瞄一眼」数据头部:例如配合 jq/count-the-number-of-things-in-a-json-file.md 中介绍的length函数,先用.[:5]看前 5 条记录确认结构,再放心处理整个数组。

负索引:从数组末尾倒数

除了从开头数,jq 还支持负索引,-1指向数组的最后一个元素,-2指向倒数第二个,以此类推。也就是说,负数是从数组末尾往回数的偏移量。

正因如此,我们可以不依赖数组长度,直接以「距末尾多远」为基准来切切片。仓库原文用它来取数组末尾的几个元素:

❯ echo '["a","b","c","d","e","f","g"]' | jq '.[-3:]' [ "e", "f", "g" ]

这里的.[-3:]表示「从倒数第 3 个元素(索引 4,即"e")一直切到数组末尾」,于是得到最后三个元素。省略m时默认到末尾,所以这条命令天然适配「数组长度未知,但我知道要取最后 N 个」的场景。

负索引与仓库内另一篇笔记 jq/get-the-last-item-from-an-array.md 一脉相承:那篇笔记展示了用.[-1]直接取最后一个元素,而切片[-3:]就是把它推广到「末尾一段连续子集」。两者可以相互印证:-1定位最后一个元素、-2定位倒数第二个……-k定位倒数第 k 个。

边界组合:灵活截取数组内部或尾部片段

掌握了「省略默认值」与「负索引」两个规则后,可以组合出多种实用切片:

取除最后一个元素外的全部内容:

❯ echo '["a","b","c","d","e","f","g"]' | jq '.[:-1]' [ "a", "b", "c", "d", "e", "f" ]

[:-1]从索引 0 切到倒数第一个元素之前,即丢弃数组最后一个元素。

取从倒数第 3 个到倒数第 2 个之前(即倒数第 3、第 2 个元素):

❯ echo '["a","b","c","d","e","f","g"]' | jq '.[-3:-1]' [ "e", "f" ]

这里n=-3(对应"e",含)与m=-1(对应"g",不含)都是负索引,jq 会先把它们换算成正索引再执行切片,结果恰好是"e"、"f"两个元素。

从正索引切到末尾:

❯ echo '["a","b","c","d","e","f","g"]' | jq '.[2:]' [ "c", "d", "e", "f", "g" ]

切片同样适用于字符串

需要提醒的是,这套[n:m]切片语法并非数组专属——jq 官方手册将其归为「Array/String Slice」,即数组和字符串共用同一套切片规则。对字符串切片时返回的是子字符串:

❯ echo '"hello world"' | jq '.[:5]' "hello"

同样支持负索引:

❯ echo '"hello world"' | jq '.[-3:-1]' "rl"

这让我们可以用完全一致的思路去截取字符串的头尾部分,而无须记忆另一套函数。

实际应用:截取大 JSON 输出的两端

在真实命令行工作中,「取两端子集」最常见的价值在于处理超长输出。例如 github/process-json-output-from-gh-with-jq.md 演示了用gh repo list --json拉取上千条仓库记录的场景——此时直接在管道里追加一个切片即可把结果收敛到可读范围:

gh repo list --limit 1000 --json nameWithOwner,description \ --jq '.[:10]'

同样地,把 JSON 文件作为输入时(参考 jq/extract-a-list-of-values.md 中.items[]的取值方式),切片可以与路径选择器组合使用,例如.[-5:]只保留数组的最后 5 条,或者先.[0:2]再继续.items[].name提取字段。这些技巧叠加后,即使面对百万级记录的文件,也能用一条命令完成「只看尾部几条」的轻量探查。

小结

jq 的切片语法[n:m]用两个规则就能覆盖大部分截取需求:

  1. n含、m不含;省略n从开头算起,省略m到末尾为止;
  2. 负索引从数组末尾往回数,-1即最后一个元素。

由此即可用.[:3]取头部、.[-3:]取尾部、.[:-1]去掉末位,且无需预先知道数组长度。该语法对数组与字符串通用,是日常处理 JSON 输出时的高频利器。想继续深入,可延伸阅读仓库中的 jq/get-the-last-item-from-an-array.md(单元素索引与last函数)、jq/extract-a-list-of-values.md(括号与通配遍历)以及 jq/count-the-number-of-things-in-a-json-file.md(length计数),串起完整的 jq 数组操作知识链。

  • 文档
  • 教程
  • 知识库

【免费下载链接】til

:memo: Today I Learned

项目地址:https://gitcode.com/gh_mirrors/ti/til
点击查看免费下载

相关推荐

上一篇:终极指南:how2命令行工具的国际化配置与多语言支持
下一篇:FileSaver.js与StreamSaver.js对比:何时选择哪个工具?

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 1:53:08

VueUse useQRCode 深度指南:在 Vue 3 中响应式生成二维码

前端 【免费下载链接】vueuse Collection of essential Vue Composition Utilities for Vue 3 项目地址: https://gitcode.com/gh_mirrors/vu/vueuse 点击查看 免费下载 useQRCode 是 VueUse 生态中 vueuse/integrations 包提供的集成函数,它把第三方二…

作者头像 李华
网站建设 2026/10/6 1:49:33

DLSS Swapper 完整指南:3 步替换游戏内 DLSS 版本,随时可回退

DLSS Swapper 完整指南:3 步替换游戏内 DLSS 版本,随时可回退 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 游戏还卡在旧版 DLSS,新 DLL 早已释出,厂商却迟迟不出补丁。…

作者头像 李华
网站建设 2026/10/6 1:48:51

JavaScript 中比较两个 Date 对象的相等性与大小

文档教程知识库 【免费下载链接】til :memo: Today I Learned 项目地址: https://gitcode.com/gh_mirrors/ti/til 点击查看 免费下载 在 JavaScript 里判断两个 Date 对象是否相等并不是一个直观的操作——即使两个对象在概念上(甚至打印出来&#xff0…

作者头像 李华
网站建设 2026/10/6 1:45:15

Packet Tracer校园网实战:VLAN间路由与NAT出网全配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华