在dot之前提取子字符串

时间:2016-11-22 09:40:03

标签: bash parameter-expansion

我尝试在bash中的dot.)之前减去第一个字符串。

例如:

1.2.3 -> 1
11.4.1 -> 11

我使用了基于docs的以下命令:

s=4.5.0
echo "${s%.*}"

但它ouptuts 4.5而不是4。我不明白。

为什么?

2 个答案:

答案 0 :(得分:8)

您需要使用%%从最后删除最长匹配:

$ echo "${s%%.*}"
4

来自the docs

  

${parameter%%word}
      删除最大的后缀模式。应扩展以产生图案。然后参数扩展将产生参数,后缀的最大部分与删除的模式匹配。

答案 1 :(得分:2)

您还可以使用最新版本的shell(自bash)内置bash 3.0 Regular Expressions功能,使用代字号(=~)运算符。

$ string="s=4.5.0"
$ [[ $string =~ =([[:alnum:]]+).(.*) ]] && printf "%s\n" "${BASH_REMATCH[1]}"
4
$ string="s=32.5.0"
$ [[ $string =~ =([[:alnum:]]+).(.*) ]] && printf "%s\n" "${BASH_REMATCH[1]}"
32