使用Bash从软件包名称中删除版本号

7
我正在尝试仅使用Bash将程序包名称中的版本信息剥离。我有一个解决方案,但我认为这并不是最好的解决方案,所以我想知道是否有更好的方法。 更好的意味着更清晰易懂。假设我有字符串“my-program-1.0”,我只想要“my-program”。我目前的解决方案是:
#!/bin/bash

PROGRAM_FULL="my-program-1.0"
INDEX_OF_LAST_CHARACTER=`awk '{print match($0, "[A-Za-z0-9]-[0-9]")} <<< $PROGRAM_FULL`
PROGRAM_NAME=`cut -c -$INDEX_OF_LAST_CHARACTER <<< $PROGRAM_FULL`

实际上,“包名称”语法是RPM文件名,如果这有关系的话。
谢谢!

1
你觉得通过 sed "s/[-0-9.]*$//" 运行它怎么样? - BCS
@BCS:或者再小心一点;例如,你的匹配会与 program-name-3...4--789 相匹配,或者更现实地说,与 program-name2-1.0 相匹配(错误地去掉了 2)。 - Cascabel
请注意,版本号可能也包含字母。 - Ignacio Vazquez-Abrams
3个回答

9
非常适合sed:
# Using your matching criterion (first hyphen with a number after it
PROGRAM_NAME=$(echo "$PROGRAM_FULL" | sed 's/-[0-9].*//')

# Using a stronger match
PROGRAM_NAME=$(echo "$PROGRAM_FULL" | sed 's/-[0-9]\+\(\.[0-9]\+\)*$//')

第二个匹配确保版本号是由点分隔的数字序列(例如X、X.X、X.X.X等)组成的。
编辑:所以基于版本号的概念并不是非常明确,这里有很多评论。你需要为你期望的输入编写一个正则表达式。希望你不会遇到像"program-name-1.2.3-a"这样糟糕的情况。除了来自OP的任何额外请求之外,我认为这里所有的答案都足够好。

1
可能想要测试第二个版本。;-) - Jon Ericson
@Jon Ericson: 我试过了。对于 name-Xname-XXname-X.Xname-X.X.X 以及其他混合的排列组合都能正常工作。但它拒绝替换任何不是格式正确的版本号,比如 name-X.。这难道不是所期望的行为吗? - Cascabel
@Jon Ericson: 哇,那是什么系统? - Cascabel
我在Solaris和Linux上都尝试过了。可能有一些设置可以在Linux上打开Perl风格的正则表达式,但我没有设置。 - Jon Ericson
@Jon Ericson:我不想这么说,但是你可能在引用时出了问题,导致\+在传递给sed之前变成了+ - Cascabel
显示剩余5条评论

4

Bash:

program_full="my-program-1.0"
program_name=${program_full%-*}    # remove the last hyphen and everything after

生成 "my-program"。

或者

program_full="alsa-lib-1.0.17-1.el5.i386.rpm"
program_name=${program_full%%-[0-9]*}    # remove the first hyphen followed by a digit and everything after

生成 "alsa-lib"

第一个是正确的,因为它利用了版本号永远不会有连字符的事实。第二个不正确,因为名称的某些部分可以以数字开头。 - Ignacio Vazquez-Abrams
@Ignacio:没错,它必须是一个像“abc-2def-1.0.42-2.foo.i286.rpm”这样的名称,这将错误地变成“abc”。 - Dennis Williamson

1

这样怎么样:

$ echo my-program-1.0 | perl -pne 's/-[0-9]+(\.[0-9]+)+$//'
my-program

严格的细节:这将匹配program-.但不匹配program-1.2.3 - Cascabel
@Jefromi: 不再是这样了。;-) Perl的RE语法看起来更漂亮。 - Jon Ericson
是的,Perl比sed好用。我只是想保持简单... +1。 - Cascabel
我们能否有一个特技,也匹配my-program-2-3-4和类似的a52dec-0.7.4-15.fc11.i586、aalib-libs-1.4.0-0.18.rc5.fc12.i686、abrt-1.1.14-1.fc13.i686、abrt-addon-ccpp-1.1.14-1.fc13.i686、abrt-addon-kerneloops-1.1.14-1.fc13.i686、abrt-addon-python-1.1.14-1.fc13.i686这样的内容。 - nyxee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接