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
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"
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')
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"