vim регулярное выражение для замены пробелов в кавычках - PullRequest
7 голосов
/ 04 июня 2010

У меня есть текст в следующем формате:

ERR_OUT_OF_MEM, "ERR OUT OF MEM"
ERR_SOMETHING_BAD, "ERR SOMETHING BAD"

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

 ERR_OUT_OF_MEM, "ERR_OUT_OF_MEM"
 ERR_SOMETHING_BAD, "ERR_SOMETHING_BAD"

Лучшее регулярное выражение, которое я мог придумать:

\("\w\+\)\@<= 

(в конце есть пробел)

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

Есть ли способ сделать это одним выстрелом?

Спасибо!

Ответы [ 3 ]

7 голосов
/ 04 июня 2010

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

:%s/\%("[^"]*"\)*\("[^"]*"\)/\=substitute(submatch(1), ' ', '_', 'g')/g

Примечание: двойные кавычки сгруппированы 2 на 2, чтобы не преобразовывать

foo bar "foo bar" "foo barr"

в

foo bar "foo_bar"_"foo_barr"

РЕДАКТИРОВАТЬ: как указывает рампион, более чем достаточно:

%s/"[^"]*"/\=substitute(submatch(0), ' ', '_', 'g')/g
6 голосов
/ 04 июня 2010

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

s/\v(\".*)@<= /_/g

Я использовал токен \ v (очень большой), потому что я думаю, что он делает регулярное выражение немного более читабельным, и я включил всю команду подстановки, так как в конце важен 'g'.

Для тех, кто следует дома, это регулярное выражение сначала устанавливает «очень магичный» режим с \ v. Затем он определяет токен (\".*), который примерно означает «двойная кавычка, а затем что-нибудь еще» и использует утверждение lookbehind @<=, чтобы сказать «только сопоставлять вещи, следующие за последним токеном» - другими словами, только совпадать с вещами, которые приходят куда-то после двойной цитаты. Наконец, есть пробел, который на самом деле сопоставляется, и термин замещения является подчеркиванием, которым мы хотим заменить его, а g говорит: «заменить все совпадающие термины», чтобы мы не просто получили найдено первое совпадение.

0 голосов
/ 22 апреля 2014

Мой Плагин PatternsOnText предоставляет команду :SubstituteInSearch. С его помощью вы сначала ищете строки в кавычках, а затем выполняете :substitute только в пределах совпадений:

/".\{-}"
:SubstituteInSearch/_/ /g
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...