grep在OSX与Debian系统提取Dockerfile版本号结果不一致问题
问题根因
OSX 系统默认搭载的是 BSD 版本 grep,对\d数字匹配符默认兼容;而 Debian 系统默认搭载的是 GNU 版本 grep,其扩展正则模式(-E参数)不识别\d作为数字匹配规则,只有 Perl 正则模式下才支持该写法,因此你原来的命令在 Debian 环境下无法匹配到结果。
可行修复方案
下面的写法均可以实现跨 BSD/GNU 环境兼容:
- 方案1:替换
\d为 POSIX 标准数字匹配规则,同时兼容多位数版本号(比如2.10.3这类版本也能正确匹配)
export AIRFLOW_VERSION=$(grep "ARG AIRFLOW_VERSION=" /Dockerfile | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+")
- 方案2:给 grep 增加
-P参数启用 Perl 正则模式,直接兼容\d写法
export AIRFLOW_VERSION=$(grep "ARG AIRFLOW_VERSION=" /Dockerfile | grep -Po "\d+\.\d+\.\d+")
- 方案3:用 awk 单步提取,兼容性更强,无需依赖 grep 版本差异
export AIRFLOW_VERSION=$(awk '/ARG AIRFLOW_VERSION=/{gsub(/[" ]/,"",$0);split($0,v,"=");print v[2]}' /Dockerfile)
内容的提问来源于stack exchange,提问作者Simon Osipov
相关产品推荐
相关产品推荐

