Замена кавычек вокруг строк в Vim? - PullRequest
28 голосов
/ 20 января 2010

У меня есть что-то похожее на <Foobar Name='Hello There'/>, и мне нужно изменить одинарные кавычки на двойные кавычки. Я пытался :s/\'.*\'/\"\0\", но в итоге получилось <Foobar Name="'Hello There'"/>. Замена \0 на \1 приводила только к пустой строке внутри двойных кавычек - есть ли какой-то особый синтаксис, который мне не хватает, мне нужно сделать только найденную строку («Hello There») внутри кавычек, назначенную для \1

Ответы [ 8 ]

57 голосов
/ 21 января 2010

Также есть surround.vim , если вы хотите делать это довольно часто. Вы бы использовали cs'" для изменения окружающих кавычек.

22 голосов
/ 20 января 2010

Вам нужно использовать группировки:

:s/\'\(.*\)\'/\"\1\"

Таким образом, аргумент 1 (т. Е. \ 1) будет соответствовать тому, что ограничено \ (и \).

14 голосов
/ 20 января 2010

%s/'\([^']*\)'/"\1"/g

Вы захотите использовать [^']* вместо .*, в противном случае

'apples' are 'red' будет преобразовано в "apples' are 'red"

8 голосов
/ 20 января 2010

если я что-то упустил, s/\'/"/g не сработает?

6 голосов
/ 07 июля 2010

Просто к вашему сведению - чтобы заменить все двойные кавычки на одинарные, это правильное регулярное выражение - на основе приведенного выше примера rayd09

:%s/"\([^"]*\)"/'\1'/g
2 голосов
/ 20 января 2010

Вам необходимо заключить круглые скобки в ту часть выражения, которую вы хотите захватить.

s/\'\(.*\)\'/"\1"/

Но у вас могут быть проблемы с непреднамеренным сопоставлением. Можете ли вы просто заменить любые одинарные кавычки на двойные в вашем файле?

1 голос
/ 20 января 2010

У вас правильная идея - вы хотите иметь "\1" в качестве предложения замены, но вам нужно сначала поместить часть "Hello There" в группу захвата 1 (0 - это полное совпадение). Попробуйте:

:%/'\(.*\)'/"\1"

0 голосов
/ 16 июня 2012

Предполагая, что вы хотите сделать это для всего файла ...

N Режим:

ggvG$ [SHIFT+:]  

Режим X:

'<,'>/'/" [RET]
...