2010-01-20 2 views
23

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

ответ

20

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

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

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

2

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

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

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

5

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

+0

Это был мой компромисс, но я чувствовал, что это не совсем правильно, особенно если в атрибуте есть одна цитата. Я не думаю, что это может произойти в XML, но это может произойти в какой-то другой ситуации по дороге, которая нуждается в этом же решении. – ravuya

+0

Одинарная цитата внутри атрибута с одним кавычком должна быть «'», а двойная кавычка внутри атрибута с двойными кавычками должна быть «"». Конечно, одна цитата может жить внутри атрибута с двойными кавычками и наоборот ... – ephemient

1

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

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

13

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

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

'apples' are 'red' бы преобразуются в "apples' are 'red"

+1

Или используйте '. \ {-}' вместо '. *'. См. ': Help/\ {-'. –

48

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

+0

Спасибо за ссылку surround.vim - я так долго желал этого. – ThomasH

+0

Есть ли способ сопоставить это с какой-нибудь командой лидера? Я не могу этого сделать: \ –

+0

Вам не нужно сопоставлять это с командой лидера, так как она использует пользовательское движение 'cs' с двумя аргументами -' '' в качестве цели и '' 'как замена – kejadlen

6

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

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

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

N Режим:

ggvG$ [SHIFT+:] 

Х Режим:

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