Найдите каждое третье значение и вставьте cr или символ новой строки в VIM - PullRequest
4 голосов
/ 10 октября 2011

Итак, у меня есть несколько больших наборов данных, которые мне нужно сделать более читабельными, и в настоящее время я должен войти и перейти к каждому 3-му значению и вставить новую строку. Я пробовал несколько вещей в VIM, чтобы заставить это работать, но ни одна, кажется, не возвращает значение, которое я ищу. Вот некоторые из моих данных:

(0.96260310749184663, 4.3830008206495812, 0.84922658632317849),
(0.96260310749184663, 5.0000002088986637, 1.049701855818201),
(0.96260310749184697, 5.6169993576359696, 0.8492264385213405),
(0.96260310749184719, 5.9983257940402384, 0.32437568665165911),
(0.96260310749184719, 5.9983258053918069, -0.32437572732698844),
(0.96260310749184719, 5.6169994358349786, -0.84922691097323821),
(0.96260310749184697, 5.0000000093711492, -1.0497019267383632)

Что мне нужно сделать, это сделать так:

(0.96260310749184663, 4.3830008206495812, 
 0.84922658632317849),
(0.96260310749184663, 5.0000002088986637, 
 1.049701855818201),
(0.96260310749184697, 5.6169993576359696, 
 0.8492264385213405),
(0.96260310749184719, 5.9983257940402384, 
 0.32437568665165911),
(0.96260310749184719, 5.9983258053918069, 
 -0.32437572732698844),
(0.96260310749184719, 5.6169994358349786, 
 -0.84922691097323821),
(0.96260310749184697, 5.0000000093711492, 
 -1.0497019267383632)

Я использовал это в выделении, чтобы попытаться переместить это 3-е значение вниз, но он продублировал всю вещь, а затем переместил всю строку вниз:

:'<,'>s/\([-[0-9.]\+,\s[-[0-9.]\+,\)/\1\r&/g

Я также попытался удалить 1, чтобы он заработал, но это тоже не сработало. Так есть ли способ, которым я могу захватить это 3-е значение и вставить возврат каретки или новую строку, чтобы сделать эту работу? Благодаря.

Редактировать ---

Я прошу прощения за неверное сообщение части моей проблемы: данные в верхней части все в одной строке, а не в нескольких строках. Это выглядит так:

(0.31852533878680489, 0.10352149350126813, -0.0046069731261429991), (0.31852526554320226, -0.103521543762028, -0.0046069731261429991), (0.19682845687859715, -0.27102285045297636, -0.004606973126142444), (-8.1184530326649769e-05, -0.33500267513407755, -0.0046069731261416669), (-0.19699089317458821, -0.27102292369657782, -0.0046069731261408897), (-0.31868770183919259, -0.10352150714022559, -0.0046069731261403346), (-0.31868770183919221, 0.10352156674487166, -0.0046069731261403346), 

Ответы [ 6 ]

5 голосов
/ 10 октября 2011
:g/./norm! 2Wi^M

Объяснение:

  • :g/./{cmd} будет запускать {cmd} в каждой строке
  • norm! выполнит следующую строку как команды нормального режима
  • 2Wi^M Движение 2 WORDS, затем вставка возврата
  • ^M осуществляется нажатием <c-v><cr> или <c-q><cr>.

Очень заманчивосделайте %norm! 2Wi^M, но это потерпит неудачу, поскольку испортит строки, над которыми ведется работа.

5 голосов
/ 10 октября 2011

Два подхода

1. ex команды и форматирование

Моя первая мысль была textwidth:

:se tw=50
:g/./norm! gqq
:%s/^[^(]/ &/g

Это

  1. устанавливает ширину текста в 50 символов
  2. переформатирует каждую (непустую) строку
  3. вставляет пробел в начале любых строк, которые не начинаются с (

2. используйте макрос

В качестве альтернативы: сделать макрос

gg
qq2f,a<CR><Esc>j0q
100000@q

Обоснование:

  1. перейти к началу буфера
  2. макрос записи q (qq начинает запись, q заканчивает запись)
    • 2f, - вперед до второй запятой
    • a<CR><Esc> - добавить новую строку
    • j0 - следующая строка, перемещение каретки на первый символ
  3. промыть и повторить (100000 - это количество повторений; обработка остановится при сбое макроса (например, в конце файла)
2 голосов
/ 11 октября 2011

Поскольку весь текст для разбиения изначально находится в одной строке, можно использовать один команда короткой замены,

:s/,.\{-},\|), /&\r/g
1 голос
/ 10 октября 2011

Создание рекурсивного макроса (в качестве альтернативы ответу макроса для 100000 раз @ sehe).

ggqa2f,a<CR><Esc>j@aq

Затем @a для запуска команды на второмлиния (вам не нужно перемещать курсор).

Визуализация:

gg

enter image description here

qa

enter image description here

2f,

enter image description here

a<Cr><Esc>

enter image description here

j@aq

enter image description here

@a

enter image description here

1 голос
/ 10 октября 2011

Используйте макросы, чтобы отформатировать строку и перейти к началу следующей строки.Затем примените этот макрос столько раз, сколько вам нужно.

Итак, запись макроса начинается с q_, где _ - регистр, затем отредактируйте строку, снова нажмите q, чтобы сохранить макрос,И наконец, примените его, используя @_, к которому вы можете добавить префикс столько раз, сколько хотите повторить.

1 голос
/ 10 октября 2011

То, как я бы это сделал, было бы примерно так:

'<,'>s/^[^,]\+,[^,]\+,\zs/\r

Перевод:

'<,'>     " Over the visual range
s/X/Y     " Substitute X with Y
^         " Start of line
[^,]\+    " Anything that isn't a comma, one or more, as many as possible
,         " A comma (end of first field)
[^,]\+    " Anything that isn't a comma, one or more again
,         " A comma (send of second field)
\zs       " Mark this point as the start of the match so we don't have to bother including all of the above in the result
\r        " We're replacing nothing at the end of the above match with a new-line (\r)

Другая альтернатива:

'<,'>s/^\(.\{-},\)\{2}/&\r

Переведено:

'<,'>s/X/Y     " As before
^              " Start of line
\(...\)        " A group containing:
.\{-},         " Everything up to and including the first comma
\{2}           " Match the preceding group twice (so up to and including the second comma)
&\r            " Replace with what was already there followed by a new-line

И еще ... учитывая, что у вас одинаковая ширина данных, перейдите к пробелу перед третьим столбцом первой строки.Нажмите Ctrl-V и спуститесь вниз, чтобы вы выбрали весь столбец пробелов (6j в вашем примере).Нажмите либо s или Shift-i (в зависимости от того, хотите ли вы сохранить пространство), а затем ENTER , а затем ESC .

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