bash 参数扩展:删除同一字符的多次出现

bash parameter-expansion: removing multiple occurences of the same character

它是 GNU bash,版本 4.4.20(1)-release (x86_64-pc-linux-gnu)。 我有带有文本的变量。例如:

var="this is     a variable   with some text     :)"

现在我想让 var2 具有相同的内容,但多个空格替换为单个空格。
我知道我们可以用 sed、tr、awk 和其他数百种方法来做到这一点……但是有没有机会用 bash 执行的参数扩展来做到这一点?
尝试过:

var=${var/  / } # replacing 2 spaces with 1, but not much helps
var=${var/[ ]*/ } # this replaces space and whatever follows.... bad idea
var=${var/*( )/}  # found this in man bash, whatever it does it still doesnt help me...

var2=$(echo $var) 希望 echo 能解决问题 - 没有解决问题,因为它不保留制表符等特殊字符..

我强烈希望用 man bash 提供的东西解决它。

*( ) 是一个 扩展的 glob,需要使用 shopt -s extglob 启用它才能使用它匹配零个或多个 spaces.

不过,正确的替换是用单个 space 替换 一个 或多个 spaces (+( ))。您还需要使用 ${var// ...} 替换 每个 出现的多个 space,而不仅仅是第一个。

$ shopt -s extglob
$ echo "$var"
this is     a variable   with some text     :)
$ echo "${var//+( )/ }"
this is a variable with some text :)