SHELL:提取不同状态下两个字符之间的字符串

时间:2017-02-13 08:31:14

标签: regex bash shell

我有一个简单的变量字符串,它有两种可能的形式:

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).+(?=-)"

但是我仍然无法为第二个问题修补它,顺便说一下我需要一个同时处理这两个案例的命令 任何建议??

6 个答案:

答案 0 :(得分:3)

你可以使用:

(?<=v)[0-9\.]+

Here就是一个例子。

答案 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