从字符串跨平台提取版本



我需要在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).*/1/p'
grep -ow '[0-9][0-9.]+[0-9]'

这只使用了一个基本的正则表达式,以及BSD grep和GNU grep共享的选项。

您可以使用

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

详细信息

  • -E-启用POSIX ERE语法
  • n-默认行输出现在被抑制
  • .*([0-9]+.[0-9]+.[0-9]+).*-任何文本,然后第1组捕获一个或多个数字,.,一个或几个数字,.,一个或者多个数字和行的其余部分
  • 1-替换仅为第1组值
  • p-只打印替换结果

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

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

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

正则表达式的解释:

[0-9]+.[0-9]+.[0-9]+:匹配一个或多个数字的出现,然后是.,然后是一个或更多个数字的发生,然后是另一个点.,然后是1个或更多数字。

-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

附带说明一下,我在Mac上使用home brew软件包安装了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($0, /[0-9][0-9.]+[0-9]/) {print substr($0, RSTART, RLENGTH)}'

它将始终打印第一个匹配项,并且每行最多只打印一个匹配项。数字中可以有零个或多个点,但前导/尾随点不会打印出来。

grep -o是相当可移植的,但并不是Go支持的每个平台都有它。例如IBMAIX。还要注意,如果一行有多个匹配项,它将在新行上打印每个匹配项。

最新更新