1195
Comment: clean up
|
1107
some precision in case the variable contains newlines
|
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. First, the most portable way would be to use `sed`: |
There are a few ways to do this: |
Line 8: | Line 6: |
# POSIX x=$(echo "$x" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') |
#POSIX, but fails if the variable contains newlines read -r var << EOF $var EOF |
Line 12: | Line 12: |
One can also achieve the same goal using Bash builtins: |
One can also achieve in bash using a herestring |
Line 15: | Line 14: |
# Bash # Remove leading whitespace: while [[ $x = [[:space:]]* ]]; do x=${x#[[:space:]]}; done # And now trailing: while [[ $x = *[[:space:]] ]]; do x=${x%[[:space:]]}; done |
# Bash still fails if the variable contains a newline. read -r x <<< "$x" |
Line 23: | Line 18: |
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]: | (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]: |
Line 39: | Line 36: |
There are many, many other ways to do this. These are not necessarily the best, but they're known to work. | 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. |
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]: This also works in KornShell, without needing the explicit extglob setting: There are many, many other ways to do this, using sed for instance: These are not necessarily the best, but they're known to work. # Bash
shopt -s extglob
x=${x##+([[:space:]])} x=${x%%+([[:space:]])}
shopt -u extglob
# ksh
x=${x##+([[:space:]])} x=${x%%+([[:space:]])}
# POSIX, suppress the trailing and leading whitespace on every lines
x=$(echo "$x" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')