Использование sed для разделения строк различной длины (координаты GPS) - PullRequest
2 голосов
/ 09 апреля 2019

Я пытаюсь разделить GPS-координаты на два отдельных поля в файле CSV. Координаты в настоящее время объединены. Вот несколько примеров:

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

Я думал разбить это, используя: sed -r 's/-/,-/g'

но это будет работать только для строк, содержащих "-", некоторые из них начинают строку с - или имеют + в середине. Знаки +/- важно сохранять, так как они определяют направление, поэтому я не могу позволить себе их потерять.

Буду очень признателен за любые советы или предложения, и спасибо, что нашли время!

Ответы [ 3 ]

3 голосов
/ 09 апреля 2019

Это может работать для вас (GNU sed):

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

Это заменяет второе вхождение + или - на ,+ или ,-.

2 голосов
/ 09 апреля 2019

С любым седом:

$ 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
1 голос
/ 09 апреля 2019

Вы можете использовать

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

См. online sed demo

Шаблон (.+)([-+]) сопоставляет и фиксирует в Группе 1 любой один или несколько символови затем захватывает - или + в группе 2, а затем замена \1,\2 вставляет запятую между группами.

Вы можете сделать шаблон немного более эффективным с помощью выражения с отрицательной скобкой:

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

, где [^-+]+ соответствует 1 или более символам, отличным от - и +.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...