Size: 1625
Comment: ${x##*([$' \t\n'])} is wrong -- you don't want to match zero or more of those characters. You want +, for one or more.
|
Size: 1195
Comment: clean up
|
Deletions are marked like this. | Additions are marked like this. |
Line 5: | Line 5: |
First, the most portable way would be to use sed: | First, the most portable way would be to use `sed`: |
Line 8: | Line 8: |
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:]]\+$//') |
# POSIX x=$(echo "$x" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') |
Line 15: | Line 12: |
One can achieve the goal using builtins, although at the moment I'm not sure which shells the following syntax supports: | One can also achieve the same goal using Bash builtins: |
Line 18: | Line 15: |
# Bash | |
Line 19: | Line 17: |
while [[ $x = [$' \t\n']* ]]; do x=${x#[$' \t\n']}; done | while [[ $x = [[:space:]]* ]]; do x=${x#[[:space:]]}; done |
Line 21: | Line 20: |
while [[ $x = *[$' \t\n'] ]]; do x=${x%[$' \t\n']}; done | while [[ $x = *[[:space:]] ]]; do x=${x%[[:space:]]}; done |
Line 24: | Line 23: |
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: | Of course, the preceding example is not optimal, 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 solution using [:glob:extglob]: |
Line 27: | Line 26: |
# Bash | |
Line 28: | Line 28: |
x=${x##+([$' \t\n'])}; x=${x%%+([$' \t\n'])} | x=${x##+([[:space:]])} x=${x%%+([[:space:]])} |
Line 32: | Line 32: |
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). |
This also works in KornShell, without needing the explicit `extglob` setting: |
Line 37: | Line 35: |
shopt -s extglob x=${x##+([[:space:]])}; x=${x%%+([[:space:]])} shopt -u extglob |
# ksh x=${x##+([[:space:]])} x=${x%%+([[:space:]])} |
Line 42: | Line 39: |
There are many, many other ways to do this. These are not necessarily the most efficient, but they're known to work. | There are many, many other ways to do this. 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 -- none of them elegant.
First, the most portable way would be to use sed:
# POSIX x=$(echo "$x" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
One can also achieve the same goal using Bash builtins:
# Bash # Remove leading whitespace: while [[ $x = [[:space:]]* ]]; do x=${x#[[:space:]]}; done # And now trailing: while [[ $x = *[[:space:]] ]]; do x=${x%[[:space:]]}; done
Of course, the preceding example is not optimal, 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 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. These are not necessarily the best, but they're known to work.