上一篇文章介绍了 jq 中的过滤器,但单独地使用过滤器无法满足复杂的实际需求,所以 jq 中引入了特殊字符(,|)和构造器来实现定制化的输出。

特殊字符

jq 中有两个特殊字符,,|,分别用于实现:

  • , 多过滤器处理相同输入
  • | 类似于 Linux 管道符操作

,

, 用于分隔多个过滤器,多个过滤器可同时对输入起作用并作为连续输出,如:

$ cat example.json | jq '.type, .required'
"object"
[
  "email"
]

|

| 的工作模式就是依照 Linux 中的管道符的处理方式,前一个过滤器的输出会作为后一个过滤器的输入,如:

$ cat example.json | jq '.type | .[0:3]'
"obj"

上述示例中,.type 作用是获取 JSON 对象的 type 值,之后将该值作为 .[0:3] 的输入,而 type 值为一个字符串,且 .[0:3] 作为于字符串时会实现获取字符子串的效果,所以输出值为 obj

构造器

构造器可以将输出以某种特定的类型进行展示,包括数组构造器 [] 和对象构造器 {}

[]

在第 1 个示例中,其输出并没有包含特定的结构,所以可以使用 [] 将其以数组的形式进行展示,如:

$ cat example.json | jq '[.type, .required]'
[
  "object",
  [
    "email"
  ]
]

{}

[] 类似,只不过输出的形式为对象。

$ cat example.json | jq '{newKeyOfType: .type, newTypeOfRequired: .required}'
{
  "newKeyOfType": "object",
  "newTypeOfRequired": [
    "email"
  ]
}

小结

特殊字符和构造器是复杂过滤器的基础,包含特殊字符和构造器的表达式也较为难懂,需要一步步拆分开进行分析。

本文使用的文件及命令见:https://github.com/a2htray/code-notebook/tree/main/Shell/jq