我正在尝试使用jq和正则表达式过滤作为 JSON 返回的AWS ECR 图像列表。
以下命令按预期工作并返回过滤列表:
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"
}
]
Run Code Online (Sandbox Code Playgroud)
但是当我尝试将正则表达式作为参数传递给 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")))'
[]
Run Code Online (Sandbox Code Playgroud)
我尝试了多种方法来传递该变量,但无法使其正常工作。其他相关信息可能是我在 mac 上使用 zsh 并且我的 jq 版本是 jq-1.5。任何帮助表示赞赏。
$reg_exp是一个引用正则表达式的变量,"$reg_exp"只是一个文字字符串。删除引号。(额外的地图/选择是多余的)
jq --arg reg_exp "[a-z0-9]-[0-9]" '.imageIds | map(select(.imageTag | test($reg_exp)))'
Run Code Online (Sandbox Code Playgroud)