Processing bash variable with sed

SiegeX's answer is better for this particular case, but you should also know how to pass arbitrary text to sed.

sed is expecting filenames as its second, third, etc. parameters, and if it doesn't find any filenames, it reads from its standard input. So if you have text that you want to process that's not in a file, you have to pipe it to sed. The most straightforward way is this:

echo "blah blah" | sed 's/blah/blam/g'

So your example would become:

LAT=$(echo "$LATLNG" | sed 's/(\(.*\),\(.*\))/\1/g')
LON=$(echo "$LATLNG" | sed 's/(\(.*\),\(.*\))/\2/g')

Alternate (better but more obscure) Methods

If you think there's any chance that $LATLNG could begin with a dash, or if you want to be pedantic, you should use printf instead of echo:

printf '%s' "$LATLNG" | sed 's/foo/bar/g'

Or a "here document", but that can be a little awkward with the construct you're using:

LAT=$(sed 's/foo/bar/g' <<END

Or if you're using bash and not worried about portability, you can use a "here string":

sed 's/foo/bar/g' <<< "$LATLNG"

This can be solved via pure shell syntax. It does require a temp variable because of the parentheses (brackets) though:




Alternatively, you can do it in one go by playing with IFS and using the read builtin:



IFS='( ,)' read _ LAT LNG _ <<<"$LATLNG"

Here's a solution that will work in any POSIX shell:

parse_coordinates () {
  IFS='(), '  # Use these characters as word separators
  set -f      # Disable globbing
  set $1      # Split $1 into separate words
  set +f      # Restore shell state
  unset IFS
  LAT=$2      # $1 is the empty word before the open parenthesis
parse_coordinates "$LATLNG"

Here's another equally portable solution that parses the specific syntax used.

LAT=${LATLNG%\)}    # strip final parenthesis
LAT=${LAT#\(}       # strip initial parenthesis
LON=${LAT##*[, ]}   # set LON to everything after the last comma or space
LAT=${LAT%%[, ]*}   # set LAT to everything before the first comma or space