如何使用sed提取版本号?

lib*_*rce 5 regex sed

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

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

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

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

我找不到如何“分组”“1 个或多个数字后跟一个点”,所以我可以告诉我至少需要一次该模式。我试过这个,但它不起作用:

\([0-9]\+\.\)\+
Run Code Online (Sandbox Code Playgroud)

有任何想法吗 ?

Bir*_*rei 10

尝试下一个“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
Run Code Online (Sandbox Code Playgroud)

它使用 {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'
$ 
Run Code Online (Sandbox Code Playgroud)

编辑评论

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