0

我有一个低于值的字符串

String1=winos-app-1.2.0-4.20120308.InLinuxOS.x86_64

我只需要从这个字符串中提取版本“1.2.0-4”

我已经尝试使用 sed 如下所述的正则表达式

sed -ne 's/[^0-9]*\(\([0-9]\.\)\{0,1\}[0-9][^.]\).*/\1/p'

但我只得到结果“1.2.0-”,“-”后缺少数字,即 4。我尝试更正它,但它返回 null。

好心提醒

4

5 回答 5

1
sed -n 's/^.*-\([0-9.]*-[0-9]*\)\..*$/\1/p'
于 2013-03-08T23:36:38.380 回答
1

grep 怎么样:

grep -Po "(?<=-)[\d.-]*(?=.\d{8})"
于 2013-03-08T23:30:19.443 回答
1

这应该有效,并且还应该解释任何超过一位数的版本号。

String1=winos-app-1.2.0-4.20120308.InLinuxOS.x86_64
sed -n 's/[^0-9]*\(\([0-9]\+\.\)\{0,2\}[0-9]\+-[0-9]\+\).*/\1/p' <<< "$String1"
1.2.0-4

顺便说一句,这也将匹配版本字符串,如(从你的问题中不清楚你是否想要这种行为):

1-1
1.2-1

如果你想强制执行w.x.y-z,你可以使用这个:

sed -n 's/[^0-9]*\(\([0-9]\+\.\)\{2\}[0-9]\+-[0-9]\+\).*/\1/p' <<< "$String1"
于 2013-03-08T23:48:48.673 回答
0

您也可以尝试参数扩展:

string1=winos-app-1.2.0-4.20120308.InLinuxOS.x86_64
string2=${string1%".${string1#*-*-*-*.}"}
version=${string2#*-*-}
printf "%s\n" "$version"
于 2013-03-09T14:01:23.247 回答
0

你能试试这个吗?

[^0-9]*\(\([0-9]\.\)\{0,2\}[0-9][^.]\).*

于 2013-03-08T23:35:08.627 回答