我正在尝试找到最佳正则表达式来从字符串中提取版本号。例如:
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个或多个数字,然后匹配任意数量的(点+数字)”。