提取字符串的版本号

Extract version number of string

我正在尝试从如下所示的字符串中获取版本号:

[7:38:06 PM] [semantic-release] › ℹ  Running semantic-release version 17.1.2
[7:38:09 PM] [semantic-release] › ✔  Published release 1.0.7 on default channel

因为我需要在 BusyBox 中执行此操作,所以我不能将 grep-P 选项一起使用:

grep -oP 'Published release \K.*? '

所以我尝试使用 sed,但我的尝试没有 return 任何东西:

sed -n 's/.*Published release (.*) .*//p'

这个命令有什么问题,或者是否有 'native' 解决方案来获得 1.0.7

你可以使用 Busybox awk:

$ busybox awk '
match([=10=],/Published release [0-9]+(\.[0-9]+)+/) {
    print substr([=10=],RSTART+18,RLENGTH-18)
}' file

输出:

1.0.7

如果使用 sed,必须转义方括号:

sed -n 's/.*Published release \(\[.0-9\]+\).*//'

您可以这样使用 sed

sed -n 's/.*Published release \([^ ]*\).*//p' file

看到一个 online demo:

s='[7:38:06 PM] [semantic-release] › ℹ  Running semantic-release version 17.1.2
[7:38:09 PM] [semantic-release] › ✔  Published release 1.0.7 on default channel'
sed -n 's/.*Published release \([^ ]*\).*//p' <<< "$s"
# => 1.0.7

详情

  • -n - 抑制默认行输出
  • .*Published release \([^ ]*\).* - 匹配
    • .* - 任意 0 个或更多字符
    • Published release - 文字文本
    • \([^ ]*\) - 第 1 组:除 space
    • 之外的任何零个或多个字符
    • .* - 任意 0 个或更多字符
  • </code> - 替换为第 1 组值</li> <li><code>p - 打印替换结果