3

我想从 bash 中的一些字符串中提取版本号,而不使用太多额外的包。到目前为止我试过了sed

这是 API:

3.81-8.1ubuntu1.1    should give :  3.81
2.68-1ubuntu2        should give :  2.68
1:1.11.3-1ubuntu2    should give :  1.11.3

到目前为止,这是我的 sed 命令:

echo ... | sed -r 's/.*([0-9\.]+).*/\1/'

但是,开局.*太贪心了,尤其是最后一种情况。我尝试了一些.*?.\{-}但没有任何成功。

我可以分两次完成,但我宁愿学习如何一次完成。

4

2 回答 2

8

你可以吗?

 grep -Po "[\d\.]*(?=-)" file

例子:

kent$  cat tt
3.81-8.1ubuntu1.1
2.68-1ubuntu2
1:1.11.3-1ubuntu2

kent$  grep -Po "[\d\.]*(?=-)" tt
3.81
2.68
1.11.3
于 2013-01-22T17:25:09.890 回答
1

为了克服贪婪,您需要更严格地使用正则表达式:

$ sed -r 's/.*([0-9]+\.[0-9]+\.?[0-9]+)-.*/\1/' file
3.81
2.68
1.11.3

这将匹配带有主要、次要和构建(可选)标记的版本号,后跟连字符。

于 2013-01-22T17:50:57.203 回答