Differences between revisions 2 and 3
Revision 2 as of 2007-06-26 00:17:35
Size: 1625
Editor: cpe-74-65-28-251
Comment: ${x##*([$' \t\n'])} is wrong -- you don't want to match zero or more of those characters. You want +, for one or more.
Revision 3 as of 2007-06-27 18:33:16
Size: 1623
Editor: GreyCat
Comment: Remove GNUism (sed s/x\+//). Ordinary Kleene closure (*) is perfectly adequate here. (Likewise in the extglob part, but I left that alone.)
Deletions are marked like this. Additions are marked like this.
Line 12: Line 12:
   x=$(echo "$x" | sed -e 's/^[[:space:]]\+//' -e 's/[[:space:]]\+$//')    x=$(echo "$x" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')

Anchor(faq67)

How can I trim leading/trailing white space from one of my variables?

There are a few ways to do this -- none of them elegant.

First, the most portable way would be to use sed:

   x=$(echo "$x" | sed -e 's/^ *//' -e 's/ *$//')
   # Note: this only removes spaces.  For tabs too:
   x=$(echo "$x" | sed -e $'s/^[ \t]*//' -e $'s/[ \t]*$//')
   # Or possibly, with some systems:
   x=$(echo "$x" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')

One can achieve the goal using builtins, although at the moment I'm not sure which shells the following syntax supports:

   # Remove leading whitespace:
   while [[ $x = [$' \t\n']* ]]; do x=${x#[$' \t\n']}; done
   # And now trailing:
   while [[ $x = *[$' \t\n'] ]]; do x=${x%[$' \t\n']}; done

Of course, the preceding example is pretty slow, because it removes one character at a time, in a loop (although it's good enough in practice for most purposes). If you want something a bit fancier, there's a bash-only solution using extglob:

   shopt -s extglob
   x=${x##+([$' \t\n'])}; x=${x%%+([$' \t\n'])}
   shopt -u extglob

Rather than specify each type of space character yourself, you can use character classes. Two character classes that are useful for matching whitespace are space and blank.

More info: ctype/wctype(3), re_format/regex(7), isspace(3).

   shopt -s extglob
   x=${x##+([[:space:]])}; x=${x%%+([[:space:]])}
   shopt -u extglob

There are many, many other ways to do this. These are not necessarily the most efficient, but they're known to work.

BashFAQ/067 (last edited 2018-11-29 15:32:42 by GreyCat)