【问题标题】:Regex to extract version from string正则表达式从字符串中提取版本
【发布时间】:2013-02-24 15:37:19
【问题描述】:

我有一个低于值的字符串

String1=winos-app-1.2.0-4.20120308.InLinuxOS.x86_64

我只需要从这个字符串中提取“1.2.0-4”的版本

我已经用 sed 尝试了下面提到的正则表达式

sed -ne 's/[^0-9]*\(\([0-9]\.\)\{0,1\}[0-9][^.]\).*/\1/p'

但我只得到结果“1.2.0-”,“-”后面缺少数字,即 4。我尝试更正它,但它返回 null。

请多指教

【问题讨论】:

    标签: regex shell sed


    【解决方案1】:

    grep 怎么样:

    grep -Po "(?<=-)[\d.-]*(?=.\d{8})"
    

    【讨论】:

      【解决方案2】:

      这应该有效,并且还应该解释任何超过一位数的版本号。

      String1=winos-app-1.2.0-4.20120308.InLinuxOS.x86_64
      sed -n 's/[^0-9]*\(\([0-9]\+\.\)\{0,2\}[0-9]\+-[0-9]\+\).*/\1/p' <<< "$String1"
      1.2.0-4
      

      顺便说一句,这也将匹配版本字符串,例如(从你的问题中不清楚你是否想要这种行为):

      1-1
      1.2-1
      

      如果你想强制执行w.x.y-z,你可以使用这个:

      sed -n 's/[^0-9]*\(\([0-9]\+\.\)\{2\}[0-9]\+-[0-9]\+\).*/\1/p' <<< "$String1"
      

      【讨论】:

      • 谢谢!非常。你能否建议一个用于检查版本的 reg ex 如果我想检查 1.0.0 版本中的任何版本可能是“1.0.0-1”或“1.0.0-2”或“1.0.0-3”,我只需要检查它是什么更新版本“-1 or -2 or -3” “1.0.0-1 or 1.0.0-2 or 1.0.0-3” 我可以使用什么正则表达式? “sed -ne s/1.0.0\-[0-9]\1/p” 这行得通吗?谢谢 ! sed -n 's/1.0.0\-[0-9]'
      【解决方案3】:
      sed -n 's/^.*-\([0-9.]*-[0-9]*\)\..*$/\1/p'
      

      【讨论】:

        【解决方案4】:

        你可以试试这个吗?

        [^0-9]*\(\([0-9]\.\)\{0,2\}[0-9][^.]\).*

        【讨论】:

          【解决方案5】:

          你也可以试试参数扩展:

          string1=winos-app-1.2.0-4.20120308.InLinuxOS.x86_64
          string2=${string1%".${string1#*-*-*-*.}"}
          version=${string2#*-*-}
          printf "%s\n" "$version"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-08-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-19
            • 2018-02-23
            • 1970-01-01
            相关资源
            最近更新 更多