如何使用sed获取版本号

如何使用sed获取版本号

如何使用 sed 获取版本号

r-blob-1.0.2-abcsomething
urllib3-2.1.4-xyzsomething
cfile-8.0-dddsomething

我怎样才能使用“sed”来剪切有-和的地方[0-9],但是在- 我知道如何在版本之后剪切结尾之后开始剪切,我只是不知道如何做开头。

所需的输出应该是

1.0.2
2.1.4
8.0

答案1

如果已知版本号位于倒数第二个破折号和最后一个破折号之间,则可以使用简单的方法

sed 's/.*-\(.*\)-.*/\1/'

应该可以解决问题。

答案2

$ sed -E 's/.*-([[:digit:]]+(\.[[:digit:]]+)+)-.*/\1/' file
1.0.2
2.1.4
8.0

版本号包含在两个之间-,由一个正整数 ( [[:digit:]]+) 后跟一个点和另一个正整数组成,至少一次 ( (\.[[:digit:]]+)+)。我们匹配它并捕获破折号之间的字符串。整行被捕获的组替换。

使用标准基本正则表达式而不是扩展表达式:

sed 's/.*-\([[:digit:]]\{1,\}\(\.[[:digit:]]\{1,\}\)\{1,\}\)-.*/\1/' file

快速而粗糙的变化,抓住仅包含数字和点的破折号之间的任何一条线:

sed -E 's/.*-([[:digit:].]+)-.*/\1/' file

答案3

-获取和之间的部分-,用一个或两个点分隔数字:

sed -En 's/.*-([0-9]+\.)([0-9]+\.)?([0-9]+)-.*/\1\2\3/p' file

使用匹配行的-n标志和…/p仅版本字符串打印版本号。如果一行不包含匹配的版本字符串,则不会打印任何内容。

如果没有匹配,其他答案(到目前为止)将打印输入行。您没有给出这种情况的示例,因此不清楚输出应该是什么样子。

答案4

使用以下命令进行测试,效果很好

sed -e "s/.*[a-z][0-9]\?-//g" -e "s/-.*//g" filename

输出

1.0.2
2.1.4
8.0

使用Python代码进行测试

#!/usr/bin/python
import re
k=open('filename','r')
h=re.compile(r'(-([0-9]\.?){1,4})')
for i in k:
    u=re.search(h,i)
    print u.group().replace("-","")



output

 python e.py 
1.0.2
2.1.4
8.0

相关内容