Использование sed для разделения строк различной длины (координаты GPS)

Я пытаюсь разделить координаты 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'

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

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

Попробуйте sed -E 's/(.+)([-+])/\1,\2/'

Wiktor Stribiżew 09.04.2019 01:09
редактировать ваш вопрос, чтобы показать ожидаемый результат с учетом этого ввода.
Ed Morton 09.04.2019 04:18

Помогает ли мое решение? Пожалуйста, дайте знать, если есть что-то еще, что неясно об этом.

Wiktor Stribiżew 11.05.2019 19:59
В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
2
3
73
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

См. онлайн sed демо

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

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

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

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

Ответ принят как подходящий

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

$ 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

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

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

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

Другие вопросы по теме