Bash 从版本号中删除内部版本号:1.3.0.342应变为1.3.0

Bash 从版本号中删除内部版本号:1.3.0.342应变为1.3.0,bash,sed,grep,Bash,Sed,Grep,对于Jenkins构建脚本,我需要从版本中删除构建编号。我需要以MajorVersion.MinorVersion.BugfixVersion结束。这些数字不是固定的一位数。如果它们已经有三个版本号,则不应发生任何事情: 1.30.0.342 -> 1.30.0 100.3.0.32 -> 100.3.0 1.3.1234.3 -> 1.3.1234 1.3.0 -> 1.3.0 如何使用grep/sed正确执行此操作 我的输入来自一个变量 export VERSION

对于Jenkins构建脚本,我需要从版本中删除构建编号。我需要以
MajorVersion.MinorVersion.BugfixVersion
结束。这些数字不是固定的一位数。如果它们已经有三个版本号,则不应发生任何事情:

1.30.0.342 -> 1.30.0
100.3.0.32 -> 100.3.0
1.3.1234.3 -> 1.3.1234
1.3.0 -> 1.3.0
如何使用grep/sed正确执行此操作

我的输入来自一个变量

export VERSION="$(gulp config --silent --getWidgetAttr=version)"

如果需要三个部分(MajorVersion.MinorVersion.BugfixVersion)

你可以用“切”来得到这个


如果需要三个部分(MajorVersion.MinorVersion.BugfixVersion)

你可以用“切”来得到这个


使用grep时,如果变量存储在
infle

$ grep -Eo '^([^.]+\.){2}[^.]+' infile
1.30.0
100.3.0
1.3.1234
1.3.0
这将模式锚定在行的开头,查找“一个或多个非周期,后跟一个周期”(重复两次),后跟“一个或多个非周期”。
-o
标志仅保留匹配的零件

或者,在带有参数扩展的纯(和模糊)Bash中(需要扩展glob,
shopt-s extglob
):

这将“从字符串末尾移除”、
“${var%pattern}”
与“从字符串开头移除(最长匹配)”、
“${var##pattern}”
,其中从末尾移除的
pattern
是“从开头移除”模式的扩展


extglob
需要将
+([[:digit:}})中的“一个或多个”与grep匹配,如果变量存储在
infle

$ grep -Eo '^([^.]+\.){2}[^.]+' infile
1.30.0
100.3.0
1.3.1234
1.3.0
这将模式锚定在行的开头,查找“一个或多个非周期,后跟一个周期”(重复两次),后跟“一个或多个非周期”。
-o
标志仅保留匹配的部分

或者,在带有参数扩展的纯(和模糊)Bash中(需要扩展glob,
shopt-s extglob
):

这将“从字符串末尾移除”、
“${var%pattern}”
与“从字符串开头移除(最长匹配)”、
“${var##pattern}”
,其中从末尾移除的
pattern
是“从开头移除”模式的扩展


extglob
需要匹配
+([[:digit:}})中的“一个或多个”

您也可以使用here字符串:

cut -f1-3 -d. <<< "1.30.0.342"
cut
命令从分隔的文本行中提取值

  • -f1-3
    =>提取字段1到3
  • -d.
    =>。是分隔符,无需将其括在引号中

    • 您也可以使用here字符串执行此操作:

      cut -f1-3 -d. <<< "1.30.0.342"
      
      cut
      命令从分隔的文本行中提取值

      • -f1-3
        =>提取字段1到3
      • -d.
        =>。是分隔符,无需将其括在引号中

      如果只需要提取3个组件的版本号,而不单独作用于它们的组件,显然是最简单的选择

      下面是一个
      awk
      解决方案,如果需要对组件进行单独处理,可能会引起兴趣(在
      awk
      脚本中,
      $1
      表示第一个组件,
      $2
      表示第二个组件,…):


      $awk'BEGIN{FS=OFS=“.”}{if(NF>3){NF=3}}}}1'如果只需要提取3个组件版本号,而不单独作用于它们的组件,显然是最简单的选择

      下面是一个
      awk
      解决方案,如果需要对组件进行单独处理,可能会引起兴趣(在
      awk
      脚本中,
      $1
      表示第一个组件,
      $2
      表示第二个组件,…):


      $awk'BEGIN{FS=OFS=“.”}{if(NF>3){NF=3}1'什么是
      -f1-3
      代表的?-f1-3=字段1到3什么是
      -f1-3
      代表的?-f1-3=字段1到3您的输入看起来像什么?是在文件中还是已经在shell变量中?您的输入看起来像什么?是在文件中还是已经在shell变量中?
      cut -f1-3 -d. <<< "$build"
      
      $ awk 'BEGIN { FS=OFS="." } { if (NF > 3) { NF = 3 } } 1' <<'EOF'
      1.30.0.342
      100.3.0.32
      1.3.1234.3
      1.3.0
      EOF
      
      1.30.0
      100.3.0
      1.3.1234
      1.3.0