请求修复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
相关产品推荐
相关产品推荐

