Differences between revisions 1 and 6 (spanning 5 versions)
Revision 1 as of 2007-05-03 00:01:56
Size: 1281
Editor: redondos
Comment:
Revision 6 as of 2008-07-04 09:01:07
Size: 883
Editor: pgas
Comment: posix solution with a here string
Deletions are marked like this. Additions are marked like this.
Line 3: Line 3:
There are a few ways to do this -- none of them elegant. There are a few ways to do this
{{{
   #POSIX
   read
-r var << EOF
  $var
   EOF
}}}
Line 5: Line 11:
First, the most portable way would be to use sed: One can also achieve in bash (and ksh93) using a herestring
Line 8: Line 14:
   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:]]\+$//')
   # Bash
   # Remove leading whitespace:
   read -r x <<< "$x"
Line 15: Line 19:
One can achieve the goal using builtins, although at the moment I'm not sure which shells the following syntax supports: There's also a solution using [:glob:extglob]:
Line 18: Line 22:
   # 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:

{{{
   # Bash
Line 28: Line 24:
   x=${x##*([$' \t\n'])}; x=${x%%*([$' \t\n'])}    x=${x##+([[:space:]])} x=${x%%+([[:space:]])}
Line 32: Line 28:
There are many, many other ways to do this. These are not necessarily the most efficient, but they're known to work. This also works in KornShell, without needing the explicit `extglob` setting:

{{{
   # ksh
   x=${x##+([[:space:]])} x=${x%%+([[:space:]])}
}}}

There are many, many other ways to do this, using sed for instance:
{{{
   # POSIX
   x=$(echo "$x" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
}}}
These are not necessarily the best, but they're known to work.

Anchor(faq67)

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

There are a few ways to do this

   #POSIX
   read -r var << EOF
   $var 
   EOF 

One can also achieve in bash (and ksh93) using a herestring

   # Bash
   # Remove leading whitespace:
   read -r x <<< "$x"

There's also a solution using [:glob:extglob]:

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

This also works in KornShell, without needing the explicit extglob setting:

   # ksh
   x=${x##+([[:space:]])} x=${x%%+([[:space:]])}

There are many, many other ways to do this, using sed for instance:

   # POSIX
   x=$(echo "$x" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')

These are not necessarily the best, but they're known to work.

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