【问题标题】:jq error syntax error, unexpected '=', expecting '}' (Unix shell quoting issues?) at <top-level>jq 错误语法错误,意外的 '=',期待 '}'(Unix shell 引用问题?)在 <top-level>
【发布时间】:2017-11-17 01:49:36
【问题描述】:
cat test.json | jq 'map(if ParameterKey == "Project"           then . + {"ParameterValue" = "jess-project"}             else .             end           )'

jq: error: syntax error, unexpected '=', expecting '}' (Unix shell quoting issues?) at <top-level>, line 1:
map(if ParameterKey == "Project"           then . + {"ParameterValue" = "jess-project"}             else .             end           )                                                                      
jq: 1 compile error

【问题讨论】:

  • 我在尝试在 PowerShell 中运行 jq 'map(if ParameterKey == "Project" then . + {"ParameterValue" = "jess-project"} else . end )' 时遇到与 Windows cmd shell quoting issues? 相同的错误,所以我认为这不是 shell 引用问题。
  • 在 LINUX 中遇到这个问题

标签: syntax-error jq


【解决方案1】:

jq 中的对象构造使用类似于 JavaScript 对象表示法 (JSON) 的语法。

{"ParameterValue" = "jess-project"} 在 JSON 中无效。你是说{"ParameterValue": "jess-project"}吗?

【讨论】:

  • 猫 test.json | jq 'map(if ParameterKey == "Project" then . + {"ParameterValue" : "jess-project"} else .end )' jq: error: ParameterKey/0 is not defined at , line 1: map(if ParameterKey == "Project" then . + {"ParameterValue" : "jess-project"} else . end ) jq: 1 compile error
  • 我建议您阅读stedolan.github.io/jq/manual 的手册以帮助您解决这个问题。也许你的意思是.ParameterKey
【解决方案2】:

在阅读this here 后遇到了这个问题,并认为我添加了这些注释,即使原来的帖子是很久以前的了。希望它可以帮助某人。

除了上面指出的错误使用= 而不是: 之外,我还对整个JSON 对象做出了错误的假设。因此,请确保您正确解析了 test.json。例如,如果所有 ParameterKey/ParameterValues 都在一个名为 Parameters 的列表中,它看起来像这样:

$ cat test.json
{
  "Parameters": [
    {
      "ParameterKey": "Project",
      "ParameterValue": "jess-project"
    },
    {
      "ParameterKey": "NumberOfInstances",
      "ParameterValue": "2"
    }
  ]
}

那么你必须考虑Parameters 列表:

$ jq '.Parameters | map(if .ParameterKey == "Project" then . + {"ParameterValue":"my-project"} else . end) | {"Parameters":.}' test.json
{
  "Parameters": [
    {
      "ParameterKey": "Project",
      "ParameterValue": "my-project"
    },
    {
      "ParameterKey": "NumberOfInstances",
      "ParameterValue": "2"
    }
  ]
}

请注意,列表是在最后一个管道的末尾添加回来的。

顺便说一句,这是更新键值的另一种方法:

$ jq '.Parameters | map((select(.ParameterKey == "Project") | .ParameterValue) |= "my-project") | {"Parameters":.}' test.json
{
  "Parameters": [
    {
      "ParameterKey": "Project",
      "ParameterValue": "my-project"
    },
    {
      "ParameterKey": "NumberOfInstances",
      "ParameterValue": "2"
    }
  ]
}

如果你想指定一个shell变量,你甚至可以这样做:

PRJ=my-project
jq --arg prj "$PRJ" '.Parameters | map((select(.ParameterKey == "Project") | .ParameterValue) |= $prj) | {"Parameters":.}' test.json > test-updated.json

在上面的示例中,我们将修改重定向到新文件test-updated.json,因为您很可能总是希望这样做,因为jq 没有像@987654333 这样的就地替换选项@。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-12
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 2014-02-18
    • 2019-12-06
    • 2013-11-15
    相关资源
    最近更新 更多