我有一个JSON数据文件(如下所示),我正在尝试使用jq实用程序查找字段值。
除键名中包含-短划线字符的字段外,其他方法都可以正常工作。
-
如何获取(至少使用)下元素的“ field-2 ”,“ field-three 3 ”或“ field-three.url ”值?content.book1``jq
content.book1``jq
我尝试了以下操作来获取值,但是对于键名中包含短划线的字段,它给了我以下错误-。我试图反斜杠-字符,但这也无济于事。
jq: error (at <stdin>:27): null (null) and number (2) cannot be subtracted jq: 1 compile error jq: error: three/0 is not defined at <top-level> jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level> jq: error: syntax error, unexpected INVALID_CHARACTER, expecting FORMAT or QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:
命令:
$ cat /tmp/my.data.json { "pages": { "book1": [ "page1", "page2-para1", "page3-para1-sentence1", "page3-para2-sentence3-word4" ] }, "content": { "book1": { "name": "giga", "url": "-", "field1": "value1", "field-2": "value-2", "field-three": { "name": "THIRD", "url": "book1/field-three/", "short-url": "book1/field-three/chota-chetan" }, "authur": { "name": "lori CHUCK", "displayIndex": 4 }, "route": "/in-gc/hindi-chini-bhai-bhai" } } } $ cat /tmp/my.data.json| jq ".pages" { "book1": [ "page1", "page2-para1", "page3-para1-sentence1", "page3-para2-sentence3-word4" ] } $ cat /tmp/my.data.json| jq ".pages.book1[0]" "page1" $ cat /tmp/my.data.json| jq ".pages.book1[1]" "page2-para1" $ cat /tmp/my.data.json| jq ".content" { "book1": { "name": "giga", "url": "-", "field1": "value1", "field-2": "value-2", "field-three": { "name": "THIRD", "url": "book1/field-three/" }, "authur": { "name": "lori CHUCK", "displayIndex": 4 }, "route": "/in-gc/hindi-chini-bhai-bhai" } } $ cat /tmp/my.data.json| jq ".content.book1" { "name": "giga", "url": "-", "field1": "value1", "field-2": "value-2", "field-three": { "name": "THIRD", "url": "book1/field-three/" }, "authur": { "name": "lori CHUCK", "displayIndex": 4 }, "route": "/in-gc/hindi-chini-bhai-bhai" } $ cat /tmp/my.data.json| jq ".content.book1.name" "giga" $ cat /tmp/my.data.json| jq ".content.book1.field1" "value1" $ cat /tmp/my.data.json| jq ".content.book1.field-2" jq: error (at <stdin>:27): null (null) and number (2) cannot be subtracted $ cat /tmp/my.data.json| jq ".content.book1.field-three" jq: error: three/0 is not defined at <top-level>, line 1: .content.book1.field-three jq: 1 compile error $ cat /tmp/my.data.json| jq ".content.book1.field-three.url" jq: error: three/0 is not defined at <top-level>, line 1: .content.book1.field-three.url jq: 1 compile error $ cat /tmp/my.data.json| jq ".content.book1.field\-2" jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1: .content.book1.field\-2 jq: 1 compile error $ cat /tmp/my.data.json| jq ".content.book1.field\\-2" jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1: .content.book1.field\-2 jq: 1 compile error $ cat /tmp/my.data.json| jq ".content.book1.'field-2'" jq: error: syntax error, unexpected INVALID_CHARACTER, expecting FORMAT or QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1: .content.book1.'field-2' jq: 1 compile error $ cat /tmp/my.data.json| jq ".content.book1.authur" { "name": "lori CHUCK", "displayIndex": 4 } $ cat /tmp/my.data.json| jq ".content.book1.route" "/in-gc/hindi-chini-bhai-bhai" $
PS: 我已经知道了,egrep所以这不是我想要的。
egrep
cat /tmp/my.data.json| jq ".content.book1"|egrep "short-url|field-2" "field-2": "value-2", "short-url": "book1/field-three/chota-chetan"
有人真的在这里做得很好:https://jqplay.org/
“-”用于jq中的否定。对于带有特殊字符(例如“-”)的键名,不能使用简化的“ .keyname”语法。有多种选择,但最可靠的方法就是使用表单.["KEY NAME"],当链接时,可以将其缩写为[“ KEY NAME”],例如.a["b-c"]的简写形式.a | .["b-c"]。
.["KEY NAME"]
.a["b-c"]
.a | .["b-c"]
如有疑问,请显式使用管道。
有关更多信息,请查阅jq手册和/或https://github.com/stedolan/jq/wiki/FAQ