JQ 的简明记法

Concise notation for JQ

根据 jq tutorial, end of §4.1,jq 有一个紧凑的符号,其中可以跳过 | 运算符(及其周围的空格)。

在 SQuAD 2.0 开发集 (download link) 上,以下表达式有效:

$> cat src/dev-v2.0.json | jq ".data" | jq ".[]" | jq ".paragraphs" | jq ".[]" | jq ".qas" | jq ".[]" | jq ".question" | head
$> cat src/dev-v2.0.json | jq ".data | .[] | .paragraphs | .[] | .qas | .[] | .question" | head

但“简明”符号却没有:

$> cat src/dev-v2.0.json | jq ".data.[].paragraphs.[].qas.[].question" | head

jq: error: syntax error, unexpected '[', expecting FORMAT or QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:jq: error: syntax error, unexpected '[', expecting FORMAT or QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:
.data.[].paragraphs.[].qas.[].question      
jq: 1 compile error

正如错误提示,这 可能 是一个编码问题,但由于表达式周围有引号,这似乎不太可能。因此,我按照 jq recommendation 在 Whosebug 上提问:我在这里缺少什么?

我正在使用 Ubuntu 20.04.3 LTS,jq-1.6,bash 5.0.17(1)。

  • .[] 在上下文 ..
  • 中访问数组(或对象)的成员
  • .data | .[] 访问上下文 . 中对象的名为 data 的字段。通过将其输送到下一个过滤器,访问的字段成为新的上下文 .,因此 .[] 访问该上下文中的数组(或对象)的成员。
  • .data[] 在上下文 ..
  • 中访问对象的名为 data 的字段中的数组(或对象)成员
jq ".data[].paragraphs[].qas[].question" dev-v2.0.json | head
"In what country is Normandy located?"
"When were the Normans in Normandy?"
"From which countries did the Norse originate?"
"Who was the Norse leader?"
"What century did the Normans first gain their separate identity?"
"Who gave their name to Normandy in the 1000's and 1100's"
"What is France a region of?"
"Who did King Charles III swear fealty to?"
"When did the Frankish identity emerge?"
"Who was the duke in the battle of Hastings?"

.x|.[]|.y 的有效缩写形式是 .x[].y