如何使用 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