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 文件名,如果重要的话。

谢谢!

4

3 回答 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、XX、XXX、...)。

编辑:因此,基于版本号的概念没有很好定义的事实,到处都有评论。您必须为您期望的输入编写一个正则表达式。希望您不会遇到像“program-name-1.2.3-a”那样糟糕的事情。虽然没有来自 OP 的任何额外要求,但我认为这里的所有答案都足够好。

于 2010-05-24T17:51:50.203 回答
4

重击:

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”

于 2010-05-24T18:53:34.653 回答
1

怎么样:

$ echo my-program-1.0 | perl -pne 's/-[0-9]+(\.[0-9]+)+$//'
my-program
于 2010-05-24T17:51:09.220 回答