Замена кавычек вокруг строк в Vim?
Вопрос
У меня есть что-то похожее на <Foobar Name='Hello There'/>
и нужно заменить одинарные кавычки на двойные кавычки.Я пытался :s/\'.*\'/\"\0\"
но в конечном итоге это привело к <Foobar Name="'Hello There'"/>
.Замена \0
с \1
только создал пустую строку внутри двойных кавычек - есть ли какой-то специальный синтаксис, которого мне не хватает, чтобы мне нужно было поместить только найденную строку ("Hello There") внутри кавычек, присвоенных \1
?
Решение
Вам нужно использовать группировки:
:s/\'\(.*\)\'/\"\1\"
Таким образом, аргумент 1 (т.е. \1) будет соответствовать всему, что разделено \( и \).
Другие советы
Есть также объемный.vim, если вы хотите делать это довольно часто.Вы бы использовали cs'"
чтобы изменить окружающие кавычки.
%s/'\([^']*\)'/"\1"/g
Вы захотите использовать [^']*
вместо того , чтобы .*
в противном случае
'apples' are 'red'
был бы преобразован в "apples' are 'red"
если только я чего-то не упускаю, не так ли s/\'/"/g
работать?
Просто К вашему сведению - чтобы заменить все двойные кавычки на одинарные, это правильное регулярное выражение, основанное на примере rayd09 выше
:%s/"\([^"]*\)"/'\1'/g
Вам нужно заключить в круглые скобки ту часть выражения, которую вы хотите зафиксировать.
s/\'\(.*\)\'/"\1"/
Но у вас могут возникнуть проблемы с непреднамеренным сопоставлением.Не могли бы вы просто заменить любые одинарные кавычки двойными кавычками в вашем файле?
У вас есть правильная идея - вы хотите иметь "\1"
в качестве вашего предложения replace, но вам нужно сначала поместить часть "Hello There" в группу захвата 1 (0 - это полное совпадение).Попробуй:
:%/'\(.*\)'/"\1"
Предполагая , что вы хотите сделать это для всего файла ...
Режим N:
ggvG$ [SHIFT+:]
Режим X:
'<,'>/'/" [RET]