正则表达式从字符串中提取版本

时间:2013-03-08 23:27:11

标签: regex shell sed

我有一个低于值的字符串

  

字符串1 = 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。

请注意,

5 个答案:

答案 0 :(得分:1)

怎么样grep:

grep -Po "(?<=-)[\d.-]*(?=.\d{8})"

答案 1 :(得分:1)

sed -n 's/^.*-\([0-9.]*-[0-9]*\)\..*$/\1/p'

答案 2 :(得分: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"

答案 3 :(得分:0)

你能试试吗?

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

答案 4 :(得分:0)

您也可以尝试参数扩展:

string1=winos-app-1.2.0-4.20120308.InLinuxOS.x86_64
string2=${string1%".${string1#*-*-*-*.}"}
version=${string2#*-*-}
printf "%s\n" "$version"