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

cd1*_*cd1 7 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`
Run Code Online (Sandbox Code Playgroud)

实际上,"包名称"语法是RPM文件名,如果重要的话.

谢谢!

Cas*_*bel 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]\+\)*$//')
Run Code Online (Sandbox Code Playgroud)

第二个匹配确保版本号是由点分隔的数字序列(例如X,XX,XXX,...).

编辑:因此,根据版本号概念定义不明确的事实,全部都有评论.你必须为你期望的输入写一个正则表达式.希望你没有像"program-name-1.2.3-a"那样糟糕的东西.如果没有来自OP的任何额外请求,我认为这里的所有答案都足够好.