Как извлечь текст, соответствующий регулярному выражению, с помощью Vim?

Я хотел бы извлечь некоторые данные из текста с помощью vim.. данные такого рода:

72" title="(168,72)" onmouseover="posizione('(168,72)');" onmouseout="posizione('(-,-)');">>
72" title="(180,72)" onmouseover="posizione('(180,72)');" onmouseout="posizione('(-,-)');">>
72" title="(192,72)" onmouseover="posizione('(192,72)');" onmouseout="posizione('(-,-)');">>
72" title="(204,72)" onmouseover="posizione('(204,72)');" onmouseout="posizione('(-,-)');">>

Данные, которые мне нужно извлечь, содержатся в: title="(168,72)".
В частности, меня интересует извлечение только этих координат.

Я думал об использовании vim, чтобы сначала удалить все до title=" .. но я на самом деле не гуру регулярных выражений .. поэтому я спрашиваю вас: если у кого-то есть подсказка: скажите, пожалуйста :)


person nick2k3    schedule 03.07.2011    source источник
comment
Как и в других опубликованных vim, использование потокового выражения очень эффективно. Эти потоковые манипуляторы также доступны с sed (почти то же самое без :%). Если вы хотите узнать больше об этих выражениях, посмотрите это введение в sed.   -  person Lynch    schedule 03.07.2011


Ответы (4)


Это заменит каждую строку списком координат с разделителями табуляции в каждой строке:

:%s/.* title="(\(\d\+\),\(\d\+\))".*/\1\t\2
person MrWednesday    schedule 03.07.2011

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

:%normal df(f)D

Это означает:

  1. % - Выполнить обычную команду для всех строк файла;
  2. normal - выполнить следующие команды в обычном режиме;
  3. df( - удалить все, пока не найдете скобку (скобка включена);
  4. f) - переместить курсор на );
  5. D - удалить все до конца строки.

Вы также можете установить диапазон, например, запустить это от строки 5 до 10:

:5,10normal df(f)D
person Magnun Leno    schedule 04.07.2011
comment
Интересный способ сделать это без макросов - person Drasill; 07.07.2011
comment
нормальная команда - очень мощный инструмент. Это почти одноразовый макрос. - person Magnun Leno; 08.07.2011

Если вам нужно специальное решение для этого одноразового случая, возможно, будет быстрее просто выбрать визуальный блок с помощью CTRL-v. Это позволит вам выбрать произвольный столбец текста (в вашем случае столбец, содержащий title="(X,Y)"), который затем можно скопировать, как обычно, с помощью y.

person Prince Goulash    schedule 03.07.2011
comment
Да, быстрая серия без мозгов, которую я использую сам, это: ^vGx....... оценка количества повторов (.) визуально - прагматично, но отлично работает в 80% случаев. - person sehe; 04.07.2011

вы можете сопоставить все внутри title=() и отбросить все остальное следующим образом:

:%s,.*title="(\(.*\))".*,\1,
person Ярослав Рахматуллин    schedule 03.07.2011