为什么jq语法中[]后接["rdfs:label"]不需要额外加.符号?
jq属性访问语法规则说明
jq的属性访问有两种明确的合法格式,差异如下:
- 简化属性访问:仅适用于属性名由纯字母、数字、下划线组成的合法标识符场景,格式为
.属性名(比如.name、.age),这种写法必须带前缀.。 - 通用括号属性访问:适用于所有属性名场景(尤其适合包含特殊字符、空格、关键字的属性名),格式为
["属性名"],该语法本身已经包含属性访问语义,不需要额外在前缀加.。
你遇到的问题原因解释
- 可正常运行的
jq -r '."@graph"[]["rdfs:label"]' 9.0/schemaorg-all-http.jsonld符合语法规则:."@graph"先取根对象的@graph属性,[]迭代该属性对应的数组的每一项,之后直接用["rdfs:label"]取每一项的rdfs:label属性,逻辑完全通顺。 - 无法运行的
jq -r '."@graph"[].["rdfs:label"]' 9.0/schemaorg-all-http.jsonld属于语法错误:你在[]后面额外加了一个.,相当于在通用括号访问语法前多余添加了属性访问前缀,jq无法识别该混合写法,自然会运行失败。
关于你看到的示例差异说明
你见到的[]后接.name的写法,这里的.name是简化属性访问,本身就要求带前缀.,等价于["name"]。也就是说.[].name和.[]["name"]是完全等价的合法写法,但是不能写成.[].["name"],这种混用两种语法的写法不符合jq的语法规范。
官方文档提到的.["foo::bar"]、.["foo.bar"]有效,指的是直接从当前上下文的根对象取属性的场景,此时最开头的.代表当前上下文对象,是必须的,和迭代数组后直接接["属性名"]的场景并不冲突。
内容的提问来源于stack exchange,提问作者chx
相关产品推荐
相关产品推荐

