1623
Comment: Remove GNUism (sed s/x\+//). Ordinary Kleene closure (*) is perfectly adequate here. (Likewise in the extglob part, but I left that alone.)
|
1107
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
[[Anchor(faq67)]] | <<Anchor(faq67)>> |
Line 3: | Line 3: |
There are a few ways to do this -- none of them elegant. First, the most portable way would be to use sed: |
There are a few ways to do this: |
Line 8: | Line 6: |
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: |
#POSIX, but fails if the variable contains newlines read -r var << EOF $var EOF }}} One can also achieve in bash using a herestring {{{ # Bash still fails if the variable contains a newline. read -r x <<< "$x" }}} (note: using IFS=$' \t' read -d "" -r x partially fix the "problem" of the newlines but adds a trailing \n) 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, suppress the trailing and leading whitespace on every lines |
Line 15: | Line 42: |
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. |
These are not necessarily the best, but they're known to work. |
How can I trim leading/trailing white space from one of my variables?
There are a few ways to do this:
#POSIX, but fails if the variable contains newlines read -r var << EOF $var EOF
One can also achieve in bash using a herestring
# Bash still fails if the variable contains a newline. read -r x <<< "$x"
(note: using IFS=$' \t' read -d "" -r x partially fix the "problem" of the newlines but adds a trailing \n)
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, suppress the trailing and leading whitespace on every lines x=$(echo "$x" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
These are not necessarily the best, but they're known to work.