如何用正则表达式从/etc/redhat-release提取OS名称及主版本号
操作系统版本提取正则方案
可直接使用的正则表达式
完全匹配需求规则的正则如下:
^(Red Hat|CentOS(?: +(?:Linux|Stream))?) +.*release +(\d+)\..*$
Linux命令行环境下可以直接结合sed完成提取,命令如下:sed -r 's/^(Red Hat|CentOS(?: +(?:Linux|Stream))?) +.*release +(\d+)\..*$/\1 \2/' /etc/redhat-release
捕获组工作逻辑
正则通过两个捕获组分别提取操作系统名称和主版本号,非捕获部分仅用于过滤冗余内容:
- 第一个捕获组
(Red Hat|CentOS(?: +(?:Linux|Stream))?):- 优先匹配开头的
Red Hat字符串,命中后直接捕获,自动忽略后续Enterprise Linux Server等冗余描述 - 若开头为
CentOS,则继续向后匹配可选的「空格+Linux/Stream」后缀,将CentOS Linux/CentOS Stream完整作为捕获结果 - 组内的
?:标识为非捕获组,仅用来完成规则匹配,不会生成独立的捕获结果,避免产生多余分组
- 优先匹配开头的
- 中间段
+.*release +:匹配两个捕获组之间的所有冗余内容,包括多余的发行版描述字段、release关键字前后的空格 - 第二个捕获组
(\d+):匹配release关键字后的首个连续数字序列,也就是操作系统主版本号,后续的\..*匹配次版本号及之后的所有剩余内容,不纳入捕获范围
效果验证
对三个示例文本的提取结果完全符合要求:
- 输入
CentOS Linux release 7.9.28 (Core)→ 输出CentOS Linux 7 - 输入
CentOS Stream release 8→ 输出CentOS Stream 8 - 输入
Red Hat Enterprise Linux Server release 7.5 (Maipo)→ 输出Red Hat 7
内容的提问来源于stack exchange,提问作者dranobob
相关产品推荐
相关产品推荐

