从字符串跨平台中提取版本

Extract version from string cross platform

我需要在 makefile 中创建一行,它将从字符串中提取版本,并且跨平台工作,最好没有依赖性。

这是我的

echo "golangci-lint has version 1.42.0 built..." | grep -oP '\d+\.\d+\.\d'

retuslt: 1.42.0

但它不适用于 mac。

尝试像这样用 sed 来做,但不起作用

echo "golangci-lint has version 1.42.0 built ..." | sed -n  's/.*\(\d+\.\d+\.\d\).*//p'

你可以使用

echo "golangci-lint has version 1.42.0 built ..." | sed -En  's/.*([0-9]+\.[0-9]+\.[0-9]+).*//p'

详情:

  • -E - 启用 POSIX ERE 语法
  • n - 现在禁止默认行输出
  • .*([0-9]+\.[0-9]+\.[0-9]+).* - 任何文本,然后第 1 组捕获一位或多位数字,.,一位或多位数字,.,一位或多位数字以及该行的其余部分
  • </code> - 替换只是第 1 组值</li> <li><code>p - 仅打印替换结果。

使用您显示的示例,您可以尝试使用以下 awk 程序,该程序将只打印整行中版本的匹配值。

echo "golangci-lint has version 1.42.0 built ..." | 
awk '
{
  match([=10=],/[0-9]+\.[0-9]+\.[0-9]+/)
  print substr([=10=],RSTART,RLENGTH)
}
'

解释: 简单的解释就是,用 shell 的 echo 命令打印行的值,并且将其输出作为标准输入发送到 awk 代码,其中使用 match 函数匹配其中提到的正则表达式。如果匹配则打印匹配值。

正则表达式解释:

[0-9]+\.[0-9]+\.[0-9]+:匹配 1 次或多次出现的数字后跟 . 后跟 1 次或多次出现的数字后跟另一个点. 后跟 1 次或多次数字。

grep -ow '[0-9][0-9.]\+[0-9]'

仅使用基本的正则表达式,以及 BSD grep 和 GNU grep 共享的选项。

-Pgnu-grep 中的实验性功能,在 Mac BSD 上不可用。但是,Mac 中可用的默认 grep 可以使用 -E 开关轻松处理,但您必须使用 [0-9][[:digit:]] 代替 \d您的搜索模式:

s="golangci-lint has version 1.42.0 built..."
grep -Eo '([0-9]+\.)+[0-9]+' <<< "$s"

# or else
grep -Eo '([[:digit:]]+\.)+[[:digit:]]+' <<< "$s"

1.42.0

附带说明一下,我使用 home brew 软件包在 Mac 上安装了 gnu-grep。

建议如下:

echo "golangci-lint has version 1.42.0 built..." | grep -o '[0-9\.]\{4,\}'

解释

[0-9\.] ---匹配单个数字或点(.)

\{4,\} ---匹配承租人4次及以上

这个awk是100%POSIX:

awk 'match([=10=], /[0-9][0-9.]+[0-9]/) {print substr([=10=], RSTART, RLENGTH)}'

它将始终打印第一个匹配项,并且每行仅(最多)一个匹配项。数字中可以有零个或多个点,但不会打印 leading/trailing 个点。

grep -o 非常便携,但并不是 Go 支持的每个平台都有它。例如。 IBM 艾克斯。另请注意,如果一行有多个匹配项,它将在新行上打印每个匹配项。