Поиск n-го совпадения в строке в vim - PullRequest
5 голосов
/ 15 марта 2012

Я редактирую вики-файл и хочу добавить новый столбец между двумя столбцами.

| *No* | *Issue* | *File* | *Status* | 
| 1 | blah | foo | open |
| 2 | blah1 | foo1 | close |

теперь между 3-м и 4-м столбцом. Я хочу вставить еще один столбец, для которого, если бы я мог найти четвертое совпадение для «|» символ в данной строке, я могу заменить его на «| |». Как это можно сделать с помощью vim?

Конечный результат будет что-то вроде

| *No* | *Issue* | *File* | | *Status* | 
| 1 | blah | foo | | open |
| 2 | blah1 | foo1 | | close |

Ответы [ 4 ]

3 голосов
/ 15 марта 2012

Как насчет записи макроса в регистр q путем ввода qq3f|a|<ESC>q в командном режиме (ESC означает нажатие клавиши Escape). Теперь вы можете применить этот макрос к каждой строке на :%norm@q.

Дополнительный бонус:

С помощью этого шаблона вы можете добавить более сложные действия, например, реплицировать первый столбец как столбец 3 (если курсор находится в первом столбце):

qqf yf|;;;p0q

Да, и ответ на ваш вопрос: Поиск 4-го вхождения | в строке выполняется с помощью 3f| (если курсор находится в позиции 0 и на символе |, как в вашем примере).

1 голос
/ 05 марта 2014
:%s/\(|[^|]*\)\{3\}/&| /

Это означает: в каждой строке (%) найдите три вхождения (\{3\}) строки, начинающейся с |с последующим любым числом не |([^|]*) и замените его на себя (&), за которым следует |.

1 голос
/ 15 марта 2012

Рассмотрим следующую команду замещения.

:%s/\%(.\{-}|\)\{4}\zs/ |/
0 голосов
/ 15 марта 2012

Вы можете позвонить sed в vim в качестве фильтра:

:%!sed 's/|/| |/3'
...