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 Réponses :
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
où [^ - +] +
correspond à 1 ou plusieurs caractères autres que -
et +
.
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
Cela pourrait fonctionner pour vous (GNU sed):
sed 's/[+-]/,&/2' file
Ceci remplace la deuxième occurrence de +
ou -
par , + ou ,-
.
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.