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. 请帮忙。谢谢。
如果您首先考虑所涉及的完整数据管道,并认识到表达式何时只是缩写形式,那么事情可能会更清楚。
在构建一个无缩写的管道时,关于“点”的基本原则非常简单:
. 指输入.foo 用于访问键“foo”的值.[] 用于扩展数组或对象有许多允许的缩写。最让你困惑的两个是:
.foo.bar 为了 .foo | .bar{foo} 为了 {"foo": .foo}另一个重要的缩写是:
E[]为E | .[]其中E为适当紧凑的表达式记住这些原则和示例,您应该能够掌握 jq 文档中解释的细节。