使用Bash从包名中剥离版本

使用Bash从包名中剥离版本,bash,shell,string-parsing,Bash,Shell,String Parsing,我试图仅使用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]")} <<<

我试图仅使用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`
#/bin/bash
PROGRAM_FULL=“my-PROGRAM-1.0”
最后一个字符的索引=`awk'{print match($0,[A-Za-z0-9]-[0-9]”)}

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

非常适合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没有提出任何其他要求,但我认为这里的所有答案都足够好。

Bash:

program_full="my-program-1.0"
program_name=${program_full%-*}    # remove the last hyphen and everything after
制作“我的程序”


生成“alsa lib”

运行它怎么样?思考一下
sed“s/[-0-9.]*$/“
?@BCS:或者更仔细一点的东西;例如,您与
program-name-3…4--789
匹配,或者更现实地与
program-name-2-1.0
匹配(也错误地剥离了2)。请注意,版本中可能也有字母。挑剔的细节:这将与
程序匹配-。
,但与
程序-1.2.3
@Jefromi:不再匹配。;)Perl的RE语法看起来更好。是的,Perl>>sed。只是想让事情变得简单+1.i586 aalib-libs-1.4.0-0.18.rc5.fc12.i686 abrt-1.1.14-1.1.fc13.i686 abrt-addon-ccpp-1.14-1.fc13.i686 abrt-1.1.14-1.fc13.i686 abrt-addon-ccpp-1.14-1.fc13.i686 abrt-addon-kerneloops-1.1.1.14-1.fc13.1.1.1.14-1.1.1.1.1.1.1.1.2.1我们能有一个特技俩匹配的特技吗@乔恩·埃里克森:是的。按预期适用于
name-X
name-XX
name-X.X
name-X.X
,以及各种其他排列。它拒绝替换任何格式不正确的版本号,如
name-X.
。这不是我想要的行为吗?在我的盒子上:
$echo my-program-1.0 | sed的/-[0-9]\+\(\.[0-9]\+\)*$/'
产生
my-program-1.0
根据文档,sed不支持
+
语法。@Jon Ericson:Whoa。那是什么系统?我在Solaris和Linux上都试过了。在Linux上可能有一个我没有设置的设置来打开Perl风格的REs。第一个设置是正确的,因为它利用了这个版本不能有连字符的事实。第二个不是,因为名称的某些部分可以以数字开头。@Ignacio:True,它必须是一个类似“abc-2def-1.0.42-2.foo.i286.rpm”的名称,该名称会错误地变成“abc”。
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