jq,何时使用点,何时不使用

xpt*_*xpt 6 syntax abbreviation jq

考虑以下json字符串

{
  "data": {
    "search": {
      "repositoryCount": 24,
      "edges": [
        {
          "node": {
            "name": "leumi-leumicard-bank-data-scraper",
            "url": "https://github.com/Urigo/leumi-leumicard-bank-data-scraper",
            "description": "Open bank data for Leumi bank and Leumi card credit card",
            . . . 
        },
        {
          "node": {
            "name": "puppeteer-demo",
            "url": "https://github.com/xJkit/puppeteer-demo",
            "description": "A demo for website scrapping by my puppet :>",
            . . . 
Run Code Online (Sandbox Code Playgroud)

如果用于jq选择data,则它.前面需要一个点 ( )。IE:

jq 'data' 
jq: error: data/0 is not defined at <top-level>, line 1:
data
jq: 1 compile error
Run Code Online (Sandbox Code Playgroud)

但是jq '.data'工作正常,所选数据变为:

{
  "search": {
    "repositoryCount": 24,
    "edges": [
      {
      ...
Run Code Online (Sandbox Code Playgroud)

如果使用jq选择search管道后,那么它并不需要一个点(.前)。IE:

$ jq '.data | {.search} ' 
jq: error: syntax error, unexpected FIELD (Unix shell quoting issues?) at <top-level>, line 1:
.data | {.search}          
jq: 1 compile error
Run Code Online (Sandbox Code Playgroud)

但是jq '.data.search'工作正常。

此外,还有一个更复杂的例子,

jq '.data.search.edges[] | {node} '
Run Code Online (Sandbox Code Playgroud)

工作正常,但

jq '.data.search.edges[] | {node.name} '
Run Code Online (Sandbox Code Playgroud)

给出:

jq: error: syntax error, unexpected FIELD, expecting '}' (Unix shell quoting issues?) at <top-level>, line 1:
.data.search.edges[] | {node.name}                             
jq: 1 compile error
Run Code Online (Sandbox Code Playgroud)

所以,总而言之,我很困惑什么时候使用点 ( .),什么时候不使用,什么时候使用jq. 请帮忙。谢谢。

pea*_*eak 7

如果您首先考虑所涉及的完整数据管道,并认识到表达式何时只是缩写形式,那么事情可能会更清楚。

在构建一个无缩写的管道时,关于“点”的基本原则非常简单:

  • . 指输入
  • .foo 用于访问键“foo”的值
  • .[] 用于扩展数组或对象

有许多允许的缩写。最让你困惑的两个是:

  • .foo.bar 为了 .foo | .bar
  • {foo} 为了 {"foo": .foo}

另一个重要的缩写是:

  • E[]E | .[]其中E为适当紧凑的表达式

记住这些原则和示例,您应该能够掌握 jq 文档中解释的细节。