web-dev-qa-db-fra.com

Traitement de la variable Bash avec SED

bash variable latlng contient une valeur de latitude et de longitude entre parenthèses comme si

(53.3096,-6.28396)

Je veux analyser cela dans une variable appelée lat et lon que j'essaie de faire via SED comme si

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

Cependant, j'obtiens l'erreur suivante:

sed: can't read (53.3096,-6.28396): No such file or directory

16
conorgriffin

Cela peut être résolu via la syntaxe pure shell. Il nécessite une variable TEMP à cause des parenthèses (parenthèses) cependant:

#!/bin/bash

LATLNG="(53.3096,-6.28396)"

tmp=${LATLNG//[()]/}
LAT=${tmp%,*}
LNG=${tmp#*,}

Alternativement, vous pouvez le faire en une fois en jouant avec IFS et en utilisant le read intégré:

#!/bin/bash

LATLNG="(53.3096,-6.28396)"

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

La réponse de Siegex est meilleure pour ce cas particulier, mais vous devez également savoir comment passer du texte arbitraire à sed.

sed s'attend à des noms de fichiers comme deuxième, troisième, etc. Paramètres, et s'il ne trouve aucun nom de fichier, il lit à partir de son entrée standard. Donc, si vous avez du texte que vous souhaitez traiter que ce n'est pas dans un fichier, vous devez le piler à sed. La voie la plus simple est la suivante:

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

Votre exemple deviendrait donc:

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

Méthodes alternatives (meilleures mais plus obscures)

Si vous pensez qu'il y a une chance que $LATLNG pourrait commencer par un tiret, ou si vous voulez être pédant, vous devez utiliser printf au lieu de echo:

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

Ou un "ici document", mais cela peut être un peu maladroit avec la construction que vous utilisez:

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

Ou si vous utilisez bash et ne vous inquiétez pas de la portabilité, vous pouvez utiliser une "chaîne ici":

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