如何使用jq过滤一个包含不同类型元素的数组

3
给定以下 JSON,我想选择所有的 command 元素。我的问题是 "checkout" 字符串干扰了我选择所有 "run" 字典的过程。
我尝试传递 jq 类似 .[].run.command 的内容,但我一直收到错误信息:jq: error (at <stdin>:33): Cannot index string with string "run" 如何排除选取 "checkout" 字符串?
[
  "checkout",
  {
    "run": {
      "command": "pip install cfn-lint pycodestyle pyflakes",
      "name": "Install Dependencies"
    }
  },
  {
    "run": {
      "command": "find stacks -type f -name \"*.yml\" -exec cfn-lint -i E3016 -i E3012 -i E1029 --template {} \\; | tee -a output.txt",
      "name": "Run cfn-lint"
    }
},
  {
    "run": {
      "command": "find stacks -type f -name \"*.py\" -exec pyflakes {} \\; | tee -a output.txt",
      "name": "Run pyflakes"
    }
  },
  {
    "run": {
      "command": "pycodestyle --show-source --show-pep8 --ignore=E501,W605 stacks/src | tee -a output.txt",
      "name": "Run pycodestyle"
    }
  },
  {
    "run": {
      "command": "if [[ -s output.txt ]]; then cat output.txt; exit 1; fi",
      "name": "Exit if there are validation warnings/errors"
    }
  }
]
2个回答

3
这里有一个解决方案,它是您展示的筛选器的一个简单变体:

.[].run?.command

"?"是一个语法糖,用于包裹try的代码块。
这是另一种变体,也许还有其他的:
.[] | objects | .run.command

2

如果你正在处理一些具有固定结构的数组集合,其中第一个项目像是别名,后面跟着一堆操作,你可以忽略第一个项目并处理其余部分。

.[1:][].run.command

否则,如果它是真正的混合类型,任何项目都可以是任何类型,那么必须进行某种过滤以作为峰值轮廓。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接