У меня есть что-то похожее на <Foobar Name='Hello There'/>
и нужно сменить отдельные кавычки на двойные кавычки. Я попробовал :s/\'.*\'/\"\0\"
, но в итоге он создал <Foobar Name="'Hello There'"/>
. Замена \0
на \1
привела только к пустой строке внутри двойных кавычек - есть ли какой-то специальный синтаксис, который мне не хватает, что мне нужно сделать только найденную строку («Hello There») внутри кавычек, назначаемой \1
?Замена кавычек вокруг строк в Vim?
ответ
Вы должны использовать группировки:
:s/\'\(.*\)\'/\"\1\"
Таким образом, аргумент 1 (то есть, \ 1) будет соответствовать любой ограничен \ (и \).
Необходимо скопировать скобки вокруг части выражения, которое вы хотите захватить.
s/\'\(.*\)\'/"\1"/
Но у вас могут возникнуть проблемы с непреднамеренным совпадением. Можете ли вы просто заменить любые одинарные кавычки двойными кавычками в вашем файле?
, если я что-то не хватает, не будет s/\'/"/g
работать?
У вас есть правильная идея: вы хотите иметь "\1"
в качестве предложения replace, но сначала вам нужно поместить часть «Hello There» в группу захвата 1 (0 - это полное совпадение). Попробуйте:
:%/'\(.*\)'/"\1"
%s/'\([^']*\)'/"\1"/g
Вы хотите использовать [^']*
вместо .*
иначе
'apples' are 'red'
бы преобразуются в "apples' are 'red"
Или используйте '. \ {-}' вместо '. *'. См. ': Help/\ {-'. –
Там также surround.vim, если вы хотите делайте это довольно часто. Вы должны использовать cs'"
, чтобы изменить окружающие кавычки.
Спасибо за ссылку surround.vim - я так долго желал этого. – ThomasH
Есть ли способ сопоставить это с какой-нибудь командой лидера? Я не могу этого сделать: \ –
Вам не нужно сопоставлять это с командой лидера, так как она использует пользовательское движение 'cs' с двумя аргументами -' '' в качестве цели и '' 'как замена – kejadlen
Просто FYI - заменить все двойные кавычки при однократном, это правильное регулярное выражение - на основе примера rayd09 в выше
:%s/"\([^"]*\)"/'\1'/g
Предполагая, что вы хотите сделать это на весь файл ...
N Режим:
ggvG$ [SHIFT+:]
Х Режим:
'<,'>/'/" [RET]
Это был мой компромисс, но я чувствовал, что это не совсем правильно, особенно если в атрибуте есть одна цитата. Я не думаю, что это может произойти в XML, но это может произойти в какой-то другой ситуации по дороге, которая нуждается в этом же решении. – ravuya
Одинарная цитата внутри атрибута с одним кавычком должна быть «'», а двойная кавычка внутри атрибута с двойными кавычками должна быть «"». Конечно, одна цитата может жить внутри атрибута с двойными кавычками и наоборот ... – ephemient