我试图找到最好的正则表达式来从字符串中提取版本号。例如:
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)