如何使用 sed 提取版本号?

如何使用 sed 提取版本号?

我正在尝试找到最佳正则表达式来从字符串中提取版本号。例如:

 echo "Version 1.2.4.1 (release mode)" | sed -ne 's/.*\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/p'

这里的问题是,只有当版本号采用“abcd”格式时,它才有效。如果有人决定添加或删除数字(“abcde”、“abc”),它就会中断。所以我想分解正则表达式并告诉 sed 我想要:

(1 个或多个数字后跟一个点)x 1 次或多次,后跟一个数字。

我找不到如何“分组”“1 个或多个数字后跟一个点”,所以我可以说我至少想要一次这种模式。我试过了,但没有用:

\([0-9]\+\.\)\+

有任何想法吗 ?

答案1

尝试下一个“sed”命令:

$ echo "Version 1.2.4.1 (release mode)" | sed -ne 's/[^0-9]*\(\([0-9]\.\)\{0,4\}[0-9][^.]\).*/\1/p'
1.2.4.1

它使用 {i,j} 语法,在第一个数字和最后一个数字之间多次选择表达式。字符串中版本号之前不应有任何数字。

另外举几个例子:

$ echo "Version 1.2.4.1.6 (release mode)" | sed -ne 's/[^0-9]*\(\([0-9]\.\)\{0,4\}[0-9][^.]\).*/\1/p'
1.2.4.1.6 
$ echo "Version 1.2 (release mode)" | sed -ne 's/[^0-9]*\(\([0-9]\.\)\{0,4\}[0-9][^.]\).*/\1/p'
1.2 
$ echo "Version 1.2. (release mode)" | sed -ne 's/[^0-9]*\(\([0-9]\.\)\{0,4\}[0-9][^.]\).*/\1/p'
$ 

编辑评论

$ echo "Version 1.2.4.1.90 (release mode)" | sed -nre 's/^[^0-9]*(([0-9]+\.)*[0-9]+).*/\1/p'

答案2

尝试这个:

[0-9]+(\.[0-9]+)*

意思是“匹配1个或多个数字,然后匹配任意数量的(点+数字)”。

相关内容