创建正则表达式来解析构建版本

时间:2011-01-28 16:22:40

标签: regex sed

我想从包含以下行的文件中获取构建版本:

 <Assembly: AssemblyVersion("004.005.0862")> 

我希望它返回

4.5.862

我在dos中使用sed并得到以下内容吐出004.005.0862

echo "<Assembly: AssemblyVersion("004.005.0862")>" | sed "s/[^0-9,.]//g"

如何清除内部版本号的每个部分的前导零?

3 个答案:

答案 0 :(得分:2)

一步完成此操作的正则表达式如下所示:

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

使用特定于sed的转义并作为完整表达式,它会变得更长一些:

s/^.*"0*\([0-9]\+\.\)0*\([0-9]\+\.\)0*\([0-9]\+\).*/\1\2\3/g

正则表达式分解为

    ^             # start-of-string
    .*"           # anything, up to a double quote
    0*([0-9]+\.)  # any number of zeros, then group 1: at least 1 digit and a dot
    0*([0-9]+\.)  # any number of zeros, then group 2: at least 1 digit and a dot
    0*([0-9]+)    # any number of zeros, then group 3: at least 1 digit
    .*            # anything up to the end of the string

答案 1 :(得分:0)

也许... | sed "s/[^0-9]*0*([1-9][0-9,.]*)/\1/g"。我正在使用子模式过滤掉你需要的部分,忽略前导零和非数字字符。

答案 2 :(得分:0)

可能有许多更聪明的方法,但有一种方法(并且相当容易理解)是通过额外的调用来管理它:

echo "version(004.005.0862)" | sed "s/[^0-9,.]//g" | sed "s/^0*//g" | sed "s/\.0*/./g"