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

时间:2017-01-21 21:22:42

标签: 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="$(gulp config --silent --getWidgetAttr=version)"

4 个答案:

答案 0 :(得分:4)

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

你可以通过“剪切”得到这个

echo "1.30.0.342" | cut -d '.' -f1-3

答案 1 :(得分:2)

如果只需要提取3个组件的版本号,而不单独对其组件进行操作,Vafa's helpful cut solution显然是最简单的选择。

这是一个awk解决方案,如果需要进行组件处理,可能会感兴趣(在awk脚本中,$1表示第一个组件,$2表示第二个组件,...):

$ 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

答案 2 :(得分:1)

使用grep,如果变量存储在infile

$ grep -Eo '^([^.]+\.){2}[^.]+' infile
1.30.0
100.3.0
1.3.1234
1.3.0

这将模式固定在行的开头,查找&#34;一个或多个非-a-period,然后是句点&#34; (重复两次),然后是#34;一个或多个非一段时间&#34;。 -o标志仅保留匹配的部分。

或者,在纯粹(且模糊不清)的Bash中使用参数扩展(需要扩展的globs,shopt -s extglob):

$ vnum=1.3.1234.3
$ echo "${vnum%"${vnum##+([[:digit:]]).+([[:digit:]]).+([[:digit:]])}"}"
1.3.1234
$ vnum=1.3.0
$ echo "${vnum%"${vnum##+([[:digit:]]).+([[:digit:]]).+([[:digit:]])}"}"
1.3.0

这会结合&#34;从字符串&#34;,"${var%pattern}"的末尾删除&#34;从字符串的开头删除(最长匹配)&#34;,"${var##pattern}",其中{{ 1}}从最后删除是从开头模式中删除&#34;删除#34;。

pattern需要匹配&#34;一个或多个&#34;在extglob

答案 3 :(得分:1)

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

cut -f1-3 -d. <<< "1.30.0.342"

如果内部版本号位于名为build的变量中,则:

cut -f1-3 -d. <<< "$build"

cut命令从分隔的文本行中提取值。

  • -f1-3 =&gt;提取字段1到3
  • -d. =&gt; 。是分隔符,不需要将其括在引号中