从字符串跨平台中提取版本
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 共享的选项。
-P
是 gnu-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 艾克斯。另请注意,如果一行有多个匹配项,它将在新行上打印每个匹配项。
我需要在 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 共享的选项。
-P
是 gnu-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 艾克斯。另请注意,如果一行有多个匹配项,它将在新行上打印每个匹配项。