如何使用jq过滤具有混合类型元素的数组

时间:2018-11-01 16:44:14

标签: json jq

鉴于以下JSON,我试图选择所有command元素。我的问题是"checkout"字符串弄乱了我对所有"run"字典的选择。

我正在尝试通过类似.[].run.command的jq传递消息,但我不断收到错误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 个答案:

答案 0 :(得分:2)

如果您要处理具有固定结构的这类数组的集合,其中第一项就像一个别名,然后执行一系列操作,则可以跳过第一项并处理其余项。

a[href^="tel:"] {
  padding-bottom: 2px;
  font-size: 1.25rem;
  color: $text-body;
  text-decoration: none;
  border-color:  rgba(0, 0, 0, .2);
  border-bottom: 1px solid;
}

a[href^="tel:"]:hover,
a[href^="tel:"]:focus,
a[href^="tel:"]:active {
    color: #000;
    border-color: #000;
    border-bottom: 1px solid;
}

否则,如果将其真正混合并且任何项目都可以是任何东西,则必须进行某种过滤以作为峰轮廓。

答案 1 :(得分:1)

以下是您所显示的过滤器的简单变体形式的解决方案:

sum(a: ~Number, b: ~Number) -> ~Number
    Produce the sum of the two numbers, a and b

“?”是.[].run?.command 包装器的语法糖。

这是另一个变体,它还建议其他人:

try