使用" cut"提取两个较大字符串的字符串。或者" sed"

时间:2017-01-13 10:10:40

标签: bash shell

我有一个简单的变量字符串,它以这种形式出现: tag = v1.0.2-15 ,或 tag = v2.0.2-15 ....

我想从" v" 之后和" - " 之前提取部分以获取始终的数字部分 (= betwen" v"和" _")

这: 1.0.2

我用过:

$ echo (tag=v1.0.2-15 | sed -n '/tag=v/,/-/p')

$ echo (tag=v1.0.2-15 | cut -d'v' -f 2)

但目前还没有发挥作用。

还有其他简单的解决方案吗?

5 个答案:

答案 0 :(得分:2)

bash regEx ~运算符

string="tag=v1.0.2-15"
[[ $string =~ ^.*v([[:graph:]]+)-.*$ ]] && printf "%s\n" "${BASH_REMATCH[1]}"
1.0.2

答案 1 :(得分:1)

一种选择是使用sed删除v之前和-之后的部分:

$ sed 's/.*v\|-.*//g' <<<'tag=v1.0.2-15'
1.0.2

这匹配任何后跟v的内容,或-之后的任何内容,并替换为空,留下您感兴趣的部分。

答案 2 :(得分:1)

使用grep的另一个简单解决方案可能如下所示: echo 'tag=v1.0.2-15' |grep -oP '(?<=v).+(?=-)'

答案 3 :(得分:1)

使用if (round($invoice_grand_total, 2) > round($payment_details['TotalPayments'], 2)) { v作为列分隔符并打印第二列:

-

输出:

1.0.2

答案 4 :(得分:1)

grep的另一个简化版本环顾四周。

echo 'tag=v1.0.2-15' | grep -oP 'v\K.*?[^-]+'
1.0.2

使用sed后退:

echo 'tag=v1.0.2-15' |sed -r 's/(^.+v)(.+)(-.*)/\2/g'
1.0.2