jq用法
一、参数说明
- r: 去掉结果中的 " 双引号
- c: 在一行显示
二、函数说明
- length: 统计键(值)总数
- type: 获取元素类型
- to_entries: 条目
- map:数组中的元素进行映射转换
- to_entries:
- from_entries:
- keys: 查找json中所有的键, 默认获取第一层键,指定键则获取子键
- has:用来是判断是否存在某个key
- sort_by: 数组排序
- reduce: 累加
三、示例
3.1、显示所有值
格式化阅读json文件
|
|
直接打开文件
|
|
一行显示值
|
|
查找所有键
|
|
去掉方括号
|
|
显示所有子值
|
|
去掉所有值 的双引号
|
|
统计键值总数
|
|
获取元素类型
|
|
取 [] 方括号中的值
|
|
获取 json 中所有 key 和 value
|
|
示例
key 和 value 的值组合
文件内容
|
|
用函数执行结果
|
|
jq 处理 JSON 文件实战:数组合并与对象覆盖
背景
现有两个 JSON 文件:
package.json:包含menus.commandPalette数组。add.json:包含add_menu数组。
目标:将 add_menu 的数组合并到 menus.commandPalette 中,并了解 jq 在数组、对象操作中的行为。
原始文件内容
通过以下命令创建两个示例文件:
|
|
jq 核心操作分析
合并两个文件中的数组
使用 -s (–slurp)将多个输入合并为一个数组,然后通过索引访问并合并:
|
|
.[0]:第一个文件(package.json).[1]:第二个文件(add.json)- 将
add_menu数组追加到commandPalette后,输出修改后的第一个对象。
jq 对数组的操作
加法(+)用于数组合并:
|
|
[1,2,3,4]
jq 对数字的操作
加法(+)用于数值相加:
|
|
3
jq 对对象的操作
对象合并时,相同 key 的值会被后面的对象覆盖:
|
|
{
"a": 1,
"b": 21,
"c": 3
}
演示:向数组中追加元素(不修改原文件)
使用 += 操作符向 add_menu 追加新对象:
|
|
{
"add_menu": [
{ "command": "go.explorer.refresh", "when": "false" },
{ "command": "go.explorer.open", "when": "false" },
{ "data-root": "/data/disk/cache" }
]
}
修改文件(安全方式)
使用临时文件避免数据丢失:
|
|
总结
jq -s将多个输入合并为一个数组,便于跨文件操作。-
+操作符的行为取决于数据类型:- 数组:合并(拼接)
- 数字:求和
- 对象:合并(右侧覆盖左侧同名字段)
- 使用
+=可方便地向数组或对象追加内容。 - 修改文件时应先写入临时文件,再替换原文件,确保操作安全。