如何通过 jq 使用特殊字符访问属性?

k0p*_*kus 1 json jq

给定这个 json 文件wtf.json

{
  "I-am-test-v2": {
    "exist": true
  },
  "works": {
    "exist": true
  }
}
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式验证它是否具有这些密钥:

$ jq 'keys' wtf.json 
[
  "I-am-test-v2",
  "works"
]
Run Code Online (Sandbox Code Playgroud)

我可以works通过以下方式访问:

$ jq .works wtf.json
{
  "exist": true
}
Run Code Online (Sandbox Code Playgroud)

但我无法选择:

$ jq .I-am-test-v2 wtf.json
Run Code Online (Sandbox Code Playgroud)

因为这会产生错误:

jq: error: am/0 is not defined at <top-level>, line 1:
.I-am-test-v2   
jq: error: test/0 is not defined at <top-level>, line 1:
.I-am-test-v2      
jq: error: v2/0 is not defined at <top-level>, line 1:
.I-am-test-v2           
jq: 3 compile errors
Run Code Online (Sandbox Code Playgroud)

我认为它与特殊 char 有关-,但我不确定如何引用或转义它,因为这些尝试也因相同的错误而失败:

 jq ".I-am-test-v2"  wtf.json 
 jq ."I-am-test-v2"  wtf.json
Run Code Online (Sandbox Code Playgroud)

或通过以下方式出现一些不同的错误:

jq ."I\-am\-test\-v2"  wtf.json 
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
.I\-am\-test\-v2  
jq: 1 compile error
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

jq .["I-am-test-v2"] wtf.json
Run Code Online (Sandbox Code Playgroud)

我应该如何访问密钥?

oli*_*liv 5

-您的键包含被解释为减法运算符的破折号。

您需要jq通过双引号您的密钥来表明它是一个字符串。

如果您在命令行中执行此操作,请将jq“脚本”括在单引号中,以避免 shell 解释任何特殊字符。

<wtf.json jq '."I-am-test-v2"' 
Run Code Online (Sandbox Code Playgroud)