la variable bash LATLNG contient une valeur de latitude et de longitude entre parenthèses comme ceci
(53.3096,-6.28396)
Je veux les analyser dans une variable appelée LAT et LON que j'essaie de faire via sed comme ça
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
bash
variable.Réponses:
Cela peut être résolu via une syntaxe de shell pure. Cependant, il nécessite une variable temporaire en raison des parenthèses (crochets):
Alternativement, vous pouvez le faire en une seule fois en jouant avec
IFS
et en utilisant la fonctionread
intégrée:la source
#!/bin/bash
La réponse de SiegeX est meilleure pour ce cas particulier, mais vous devez également savoir comment transmettre du texte arbitraire à
sed
.sed
attend les noms de fichiers comme ses 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 à traiter qui n'est pas dans un fichier, vous devez le diriger verssed
. La façon la plus simple est la suivante:Votre exemple deviendrait donc:
Méthodes alternatives (meilleures mais plus obscures)
Si vous pensez qu'il y a une chance qui
$LATLNG
pourrait commencer par un tiret, ou si vous voulez être pédant, vous devriez utiliser à laprintf
place deecho
:Ou un "document ici", mais cela peut être un peu gênant avec la construction que vous utilisez:
Ou si vous utilisez
bash
et ne vous inquiétez pas de la portabilité, vous pouvez utiliser une "chaîne ici":la source
Voici une solution qui fonctionnera dans n'importe quel shell POSIX:
Voici une autre solution tout aussi portable qui analyse la syntaxe spécifique utilisée.
la source
la source
set -- ...
Il y a de fortes chances que le premier personnage soit un-
.