【问题标题】:jq: pass variable argument to be used as filter [duplicate]jq:传递变量参数以用作过滤器[重复]
【发布时间】:2018-09-04 21:35:14
【问题描述】:

如何将 变量 参数传递给将用作过滤器的 JQ 程序。由于默认情况下 --arg 将参数作为用引号括起来的字符串传递,因此不能用于应用过滤器。

这里是一个 JQ 程序,它在给定的 json 中找到一个特定的路径并向该路径添加一个静态键值,但由于引号问题而无法工作。

--argjson name '{ "pattern": "XYZ"}' 'def p: "." + (paths | select(.[-1] == "p-enum") | .[0:-1] | join(".")) ; .|p += $name' sample.json

这里是示例 json

{
  "type": "object",
  "description": "Contains information.",
  "properties": {
    "type": {
      "description": "Type.",
      "type": "string",
      "p-enum": [
        {
          "value": "IND",
          "description": "Ind."
        },
        {
          "value": "PROP",
          "description": "Prop."
        }
      ]
    }
  }
}

【问题讨论】:

  • 您通常不会/不应该将“程序”作为参数传递给您的程序。在这种情况下,过滤器就是程序。出于同样的原因,为什么不应该使用 eval() 和等价物,而且很简单,这里不支持它。想一个不同的方法来制定你的过滤器。如果这不是一个选项,只需将变量过滤器作为过滤器本身运行...

标签: jq


【解决方案1】:

根据我如何解释您在other question 中使用 jq 的方式,这取决于您的过滤器的复杂程度。 jq 解释的任何论点都不是您应该处理的方式。这相当于使用eval(),不仅不受支持,而且不是解决此问题的好方法。

如果您只是访问输入的属性,则有两种方法可以使用简单索引或使用 getpath/1 嵌套路径。

# indexing
# { "properties": ... }
$ jq --arg p 'properties' '.[$p]' input.json
# using getpath
# { "foo": { "bar": ... } }
$ jq --argjson path '["foo","bar"]' 'getpath($path)' input.json

【讨论】:

  • 属性是派生的。我只有一个特定的密钥和一个 json 文件。我的意图是扫描 json 文件,获取该特定键的路径并添加一个新的静态键:值作为该路径的兄弟。所以我计划这样做的方式是,获取路径并将其作为过滤器使用+ =“key:value”进行管道传输。但是,当我尝试这样做时,路径表达式无效,因为 JQ 认为过滤器带有引号,因此不起作用。如果需要,我可以粘贴所有代码。
  • 用更多输入修改了我的问题,请检查@hobbs
  • 我尝试使用 .[$arg] 并且它只适用于一个级别。不适用于嵌套结构。
猜你喜欢
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
相关资源
最近更新 更多