提取字符串的版本号
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
- 打印替换结果
我正在尝试从如下所示的字符串中获取版本号:
[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
- 打印替换结果