- 文档
- 教程
- 知识库
【免费下载链接】til
:memo: Today I Learned
本篇指南聚焦于 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]用两个规则就能覆盖大部分截取需求:
n含、m不含;省略n从开头算起,省略m到末尾为止;- 负索引从数组末尾往回数,
-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
相关推荐
Enzyme ReactWrapper `.slice()` 方法详解:按数组切片规则截取节点子集
Enzyme ReactWrapper .slice 方法详解:按数组切片规则截取节点子集 .slice begin , end 是 Enzyme 中 Reac
测试前端从数组创建切片:掌握 Go 的 `[n:m]` 切片语法与边界省略规则
从数组创建切片:掌握 Go 的 n:m 切片语法与边界省略规则 导读 Go 中的切片(slice)是对底层数组(array)的灵活抽象,日常开发中我们经常需要基
文档教程知识库3行代码搞定!bash数组切片技巧:告别繁琐的子数组提取
3行代码搞定!bash数组切片技巧:告别繁琐的子数组提取 在bash脚本编程中,数组是处理批量数据的强大工具,但许多新手常因复杂的子数组提取操作而却步。本文将介
教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考