Двойные кавычки в одинарных кавычках и наоборот

Часто я обнаруживаю, что переворачиваю цитаты:
из двойных кавычек "" в одинарные кавычки '' и
из одинарных кавычек '' в двойные кавычки "".

Я знаю, что есть способ переключить одинарные кавычки в двойные кавычки:
:%s/'\(\([^']*\)\)'/"\1"/g

И способ переключения двойных кавычек на одиночные кавычки:
:%s/"\(\([^"]*\)\)"/'\1'/g

но как мне сделать обе операции вместе без включения первых кавычек с заменой во второй замене?

Ответ 1

Если в строковых литералах нет экранированных кавычек, и не требуется обеспечить правильное сопряжение кавычек, можно использовать команду

:%s/['"]/\="'\""[submatch(0)!='"']/g

Ответ 2

Обычно, когда вы хотите поменять A и B таким образом, вам нужен промежуточный шаг, на котором вы заменяете A чем-то совершенно другим и, скорее всего, уникальным в документе, будь то необычный символ или что-то длиннее и сумасшедшее, как |x-monkeyz-x|.

Затем вы можете преобразовать все Bs в As и, наконец, все |x-monkeyz-x| в Bs.

Например,

  • Замените все ' на !X!
  • Замените все " на '
  • Замените все !X! на "

ИЗМЕНИТЬ

Это лучше: Самый простой способ поменять местами две строки в Vim?

Ответ 3

Используйте \=:

:%s/'\([^']*\)'/\='"'.tr(submatch(1), '"', "'").'"'/g

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

Ответ 4

Обычно я использую промежуточную строку, такую ​​как мое имя, которое вряд ли появится в тексте:

  • Изменить одиночную кавычку на UNLIKELY_STRING
  • Изменить двойную кавычку на одиночную кавычку
  • Изменить UNLIKELY_STRING на двойную кавычку