Вопрос

У меня есть что-то похожее на <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]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top