从jq中的变量传递正则表达式

时间:2016-07-15 12:55:06

标签: jq

我尝试使用AWS ECR image list和正则表达式过滤返回为JSON的jq

按照预期执行命令并返回已过滤的列表:

aws ecr list-images --registry-id 123456789012 --repository-name repo | jq '.imageIds | map(select(.imageTag)) | map(select(.imageTag | test("[a-z0-9]-[0-9]")))'

[
  {
    "imageTag": "bbe3d9-2",
    "imageDigest": "sha256:4c0e92098010fd26e07962eb6e9c7d23315bd8f53885a0651d06c2e2e051317d"
  },
  {
    "imageTag": "3c840a-1",
    "imageDigest": "sha256:9d05e04ccd18f2795121118bf0407b0636b9567c022908550c54e3c77534f8c1"
  },
  {
    "imageTag": "1c0d05-141",
    "imageDigest": "sha256:a62faabb9199bfc449f0e0a6d3cdc9be57b688a0890f43684d6d89abcf909ada"
  }
]

但是当我尝试将正则表达式作为参数传递给jq时,它返回一个空数组。

aws ecr list-images --registry-id 123456789012 --repository-name repo | jq --arg reg_exp "[a-z0-9]-[0-9]" '.imageIds | map(select(.imageTag)) | map(select(.imageTag | test("$reg_exp")))'

[]

我尝试了多种方法来传递该变量,但却无法使其发挥作用。其他相关信息可能是我在mac上使用zsh而我的jq版本是jq-1.5。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

$reg_exp是一个引用你的正则表达式的变量,"$reg_exp"只是一个文字字符串。删除引号。 (并且额外的地图/选择是多余的)

jq --arg reg_exp "[a-z0-9]-[0-9]" '.imageIds | map(select(.imageTag | test($reg_exp)))'