对于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)"
答案 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; 。是分隔符,不需要将其括在引号中