You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求修复Fedora/RHEL包名与版本解析的正则表达式(仅基础命令)

解析RPM包名与版本的基础命令方案

核心思路

RPM包名的结构规律为:包名-版本-发布号.额外信息.架构,其中包名可包含连字符,版本部分的起始是第一个「以数字开头、包含小数点/数字」的片段前的连字符。我们需要精准定位这个分界点,避免错误拆分带连字符的包名。

方法1:使用awk(推荐,逻辑更清晰)

awk通过正则分组匹配实现精准提取,适配含连字符的包名:

awk 'match($0, /^(.+)-([0-9][^-]+-[0-9]+)\./, arr) { printf "pkg: %-15s version: %s\n", arr[1], arr[2] }'

示例用法

处理示例包名:

echo "python39-3.9.16-1.module+el8.8.0+18968+3d7b19f0.1.x86_64" | awk 'match($0, /^(.+)-([0-9][^-]+-[0-9]+)\./, arr) { printf "pkg: %-15s version: %s\n", arr[1], arr[2] }'

输出:

pkg: python39        version: 3.9.16-1

处理带连字符的包名(如postgresql-server-12.15-1.el8.x86_64):

echo "postgresql-server-12.15-1.el8.x86_64" | awk 'match($0, /^(.+)-([0-9][^-]+-[0-9]+)\./, arr) { printf "pkg: %-15s version: %s\n", arr[1], arr[2] }'

输出:

pkg: postgresql-server version: 12.15-1

方法2:修复后的sed命令

如果坚持使用sed,调整正则以适配含连字符的包名:

sed -E 's/^(.+)-([0-9][^-]+-[0-9]+)\..*/pkg: \1   version: \2/'

示例用法

echo "python39-3.9.16-1.module+el8.8.0+18968+3d7b19f0.1.x86_64" | sed -E 's/^(.+)-([0-9][^-]+-[0-9]+)\..*/pkg: \1   version: \2/'

输出:

pkg: python39   version: 3.9.16-1

正则说明

  • ^(.+)-:匹配从开头到最后一个符合条件的连字符(后续紧跟版本片段),确保包名完整性(即使含连字符)
  • ([0-9][^-]+-[0-9]+):匹配「版本+发布号」片段,要求以数字开头,包含非连字符内容后接连字符+数字(对应发布号)
  • \..*:匹配版本后的点及所有后续内容,替换时直接忽略

内容的提问来源于stack exchange,提问作者MaxU - stand with Ukraine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 00:40:13