使用Bash从包名称中剥离版本

时间:2010-05-24 17:44:15

标签: 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]")} <<< $PROGRAM_FULL`
PROGRAM_NAME=`cut -c -$INDEX_OF_LAST_CHARACTER <<< $PROGRAM_FULL`

实际上,“包名称”语法是RPM文件名,如果重要的话。

谢谢!

3 个答案:

答案 0 :(得分:7)

非常适合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 :(得分:3)

击:

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

制作“我的程序”

或者

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”

答案 2 :(得分:1)

怎么样:

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