我有一个简单的变量字符串,它有两种可能的形式:
1。第一种情况:tag = v1.0.2-15,或tag = v2.0.2-15 ....
2。第二种情况: tag = v1.0.2,或tag = v1.1.2 .....
我需要提取总是数字部分,这只是在“v”之后和之前的“ - ”(对于第一种情况)和使用最后一个数字字符(对于第二种情况)
最终获得这种形式的输出: 1.0.2 或 1.0.2 ......
我已经使用此命令来获取第一个案例:
grep -oP "(?<=v).+(?=-)"
但是我仍然无法为第二个问题修补它,顺便说一下我需要一个同时处理这两个案例的命令 任何建议??
答案 0 :(得分:3)
答案 1 :(得分:2)
grep -oP '(?<=v)[0-9]+(\.[0-9]+)*'
这会查找v
(不是匹配的一部分),后跟字符串,其中包含一个或多个数字,后跟一个或多个由点后跟一个或多个数字组成的字符串。
答案 2 :(得分:1)
也许这一个:grep -oP "[0-9].[0-9].[0-9]"
?
答案 3 :(得分:1)
无需外部grep
计划:
tag=${tag%%-*}
会删除-
之后的所有字符(如果存在)。
tag=${tag:1}
将删除第一个字符(&#34; v&#34;)。
tag=v1.0.2-15
tag=${tag%%-*}
echo ${tag:1}
tag=v2.0.2-15
tag=${tag%%-*}
echo ${tag:1}
tag=v1.0.2
tag=${tag%%-*}
echo ${tag:1}
tag=v1.1.2
tag=${tag%%-*}
echo ${tag:1}
给出:
1.0.2
2.0.2
1.0.2
1.1.2
答案 4 :(得分:1)
awk -F'[-v]' '{print $2}'
将是另一种选择。
答案 5 :(得分:1)
使用regEx
中的bash
与~
运算符(从bash 3.0
开始支持)
[[ $tag =~ ^v([[:digit:]|.]+).* ]] && printf "%s\n" "${BASH_REMATCH[1]}"
将命令的输出输出到
cmd | while read -r line; do [[ $tag =~ ^v([[:digit:]|.]+).* ]] && printf "%s\n" "${BASH_REMATCH[1]}"; done
一些示例供您参考,
tag="v1.0.2-15"
[[ $tag =~ ^v([[:digit:]|.]+).* ]] && printf "%s\n" "${BASH_REMATCH[1]}"
1.0.2
tag="v1.0.2"
[[ $tag =~ ^v([[:digit:]|.]+).* ]] && printf "%s\n" "${BASH_REMATCH[1]}"
1.0.2
tag="v1.0.2-v1.2.9.2"
[[ $tag =~ ^v([[:digit:]|.]+).* ]] && printf "%s\n" "${BASH_REMATCH[1]}"
1.0.2