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

Passing regular expression from variable in jq

我正在尝试过滤 AWS ECR image list returned as JSON with jq 和正则表达式。

以下命令按预期工作并且 return 筛选列表:

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 时,它 return 一个空数组。

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。感谢任何帮助。

$reg_exp 是一个引用您的正则表达式的变量,"$reg_exp" 只是一个文字字符串。删除引号。 (额外的 map/select 是多余的)

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