Замена кавычки отмечает вокруг строк в Vim?

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

29
задан Nick Knowlson 29 April 2011 в 23:25
поделиться

7 ответов

Вам необходимо использовать группировки:

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

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

23
ответ дан 28 November 2019 в 00:37
поделиться

Если я что-то не хватает, не будет S / \ '/ «/ G работа?

8
ответ дан 28 November 2019 в 00:37
поделиться

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

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

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

2
ответ дан 28 November 2019 в 00:37
поделиться

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

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

1
ответ дан 28 November 2019 в 00:37
поделиться

% S / '\ ([^'] * \) '/ "\ 1" / G

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

«Яблоки» являются «красными» , будут преобразованы в «Яблоки» - «красным»

14
ответ дан 28 November 2019 в 00:37
поделиться

Также есть Surround.Vim , если вы хотите сделать это довольно часто. Вы бы использовали CS '", чтобы изменить окружающие цитаты.

58
ответ дан 28 November 2019 в 00:37
поделиться

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

:%s/"\([^"]*\)"/'\1'/g
6
ответ дан 28 November 2019 в 00:37
поделиться