How to replace multiple spaces with a single space using Bash?
Here is a way to do this using pure bash
and extglob
:
s="too many spaces."
shopt -s extglob
echo "${s//+([[:blank:]])/ }"
too many spaces.
- Bracket expression
[[:blank:]]
matches a space or tab character +([[:blank:]])
matches one or more of the bracket expression (requiresextglob
)
Using tr
:
$ echo "too many spaces." | tr -s ' '
too many spaces
man tr
:
-s, --squeeze-repeats
replace each sequence of a repeated character that is listed in
the last specified SET, with a single occurrence of that charac‐
ter
Edit: Oh, by the way:
$ s="foo bar"
$ echo $s
foo bar
$ echo "$s"
foo bar
Edit 2: On the performance:
$ shopt -s extglob
$ s=$(for i in {1..100} ; do echo -n "word " ; done) # 100 times: word word word...
$ time echo "${s//+([[:blank:]])/ }" > /dev/null
real 0m7.296s
user 0m7.292s
sys 0m0.000s
$ time echo "$s" | tr -s ' ' >/dev/null
real 0m0.002s
user 0m0.000s
sys 0m0.000s
Over 7 seconds?! How is that even possible. Well, this mini laptop is from 2014 but still. Then again:
$ time echo "${s//+( )/ }" > /dev/null
real 0m1.198s
user 0m1.192s
sys 0m0.000s