2
votes

Utilisation de sed pour diviser des chaînes de longueur variable (coordonnées GPS)

J'essaie de diviser les coordonnées GPS en deux champs distincts dans un fichier CSV. Les coordonnées sont actuellement combinées. Voici quelques exemples:

+40.71427-074.00597/
-42+174/
+33.20984-087.56917/
+39.76-098.5/
+39.76-098.5/
+42.27756-083.74088/

Je pensais diviser ceci en utilisant: sed -r 's / - /, - / g'

mais cela ne fonctionnerait que pour les chaînes contenant un "-", certaines d'entre elles commencent la chaîne par un - ou avoir un + au milieu. Les signes +/- sont importants à garder car ils déterminent la direction, donc je ne peux pas me permettre de les perdre.

Tout conseil ou suggestion serait grandement apprécié et merci d'avoir pris le temps!


3 commentaires

Essayez sed -E 's / (. +) ([- +]) / \ 1, \ 2 /'


modifiez votre question pour afficher le résultat attendu compte tenu de cette entrée.


ma solution vous aide-t-elle? Veuillez faire savoir s'il y a autre chose qui n'est pas clair à ce sujet.


3 Réponses :


1
votes

Vous pouvez utiliser

's/([^-+]+)([-+])/\1,\2/' # POSIX ERE
's/\([^-+]*\)\([-+]\)/\1,\2/' # POSIX BRE

Voir le en ligne sed démo

Le modèle (. +) ([- +]) correspond et capture dans le groupe 1 un ou plusieurs caractères, puis capture un - ou + dans le groupe 2, puis le remplacement de \ 1, \ 2 insère une virgule entre les groupes.

Vous pouvez faire le motif un peu plus efficace avec une expression entre crochets inversés:

sed -E 's/(.+)([-+])/\1,\2/'  file > newfile # POSIX ERE syntax
sed 's/\(.*\)\([-+]\)/\1,\2/' file > newfile # POSIX BRE syntax

[^ - +] + correspond à 1 ou plusieurs caractères autres que - et +.


0 commentaires

2
votes

Avec n'importe quel sed:

$ sed 's:\(.*\)\([+-].*\)/:\1,\2:' file
+40.71427,-074.00597
-42,+174
+33.20984,-087.56917
+39.76,-098.5
+39.76,-098.5
+42.27756,-083.74088


0 commentaires

2
votes

Cela pourrait fonctionner pour vous (GNU sed):

sed 's/[+-]/,&/2' file

Ceci remplace la deuxième occurrence de + ou - par , + ou ,-.


0 commentaires