Как освободить выбранные символы от подстановки в Vim - PullRequest
1 голос
/ 03 ноября 2019

У меня есть этот текст:

"1-1-1"
"1-1-2"
"1-1-3"
"1-2-1"
"1-2-2"
"1-2-3"
"1-3-1"
"1-3-2"
"1-3-3"

Я хочу вставить 0 в каждую строку после второго дефиса, превращая "1-1-1" в "1-1-01".

Я попытался заменитьс :%s/-\d"/-0\d/, но это превращает 1-1-1 в 1-1-0d.

Как вставить один символ без изменения окружающего текста?

Ответы [ 5 ]

1 голос
/ 04 ноября 2019

Просто хочу добавить другую особенность на ринг, потому что я нахожу ее совершенно уникальной. Регулярные выражения Vim имеют два атома нулевой ширины для обозначения начала (\zs) и конца (\ze) текста, который следует считать совпадением. Вы можете использовать их интересными способами, такими как:

:%s/-\zs\ze\d"/0/

, который говорит vim заменить текст между \zs и \ze (который здесь пустой) на 0, если остальныесовпадений регулярного выражения.

В качестве альтернативы можно использовать только \ze:

:%s/-\ze\d"/-0/

, который говорит vim заменить - на -0, когда за исходным - следуетцифра и двойная кавычка.

См. :help \zs и :help \ze для получения дополнительной информации.

0 голосов
/ 03 ноября 2019

Это может быть проще:

:%s/\d\+"/0&

\d\+" ................ gets the last number and the close quote
0 .................... the wanted zero
& .................... let's get back the searched pattern

Еще одно простое решение:

:%norm 2f-a0

% ................... whole file
norm ................ normal mode
2f- ................. jump to the second dash "-"
a ................... start insert on append mode
0 ................... the character we want insert
0 голосов
/ 03 ноября 2019

Начиная с обычного режима, вы можете поместить курсор на последний дефис первой строки и использовать:

<c-v>GA0<esc>

Объяснение:

  • <c-v>: Ctrl + vдля входа в блочно-визуальный режим
  • G: расширить визуальный выбор до конца файла
  • A0: войти в режим вставки и ввести 0
  • <esc>: режим Escape-вставки

Подробнее в :help v_b_A

0 голосов
/ 03 ноября 2019

Спасибо Тиму Бигелайзену за ответ!

Финальный RegEx был :%s/-\(\d+\)"$/-0\1"/

В основном его ответ, за исключением того, что я должен был избежать каждой скобки с обратной косой чертой \

Разбивка: :%s + / + -\(\d+\)"$ + / + -0\1" + /

  • :%s: открыть функцию замены для всех строк в файле
  • /: начать шаблон для поиска
  • -\(\d+\)"$: поиск всех -, за которыми следуют одна или несколько цифр \d+, за которыми следует конецстрока $

    • круглые скобки () создают "группу захвата", а обратные косые черты \ экранируют круглые скобки, поэтому они не интерпретируются буквально
  • /: конец шаблона / начальная строка замены

  • -0\1": замена дефиса (-0), за которым следует «группа захвата # 1» (\1)с последующей цитатой "
    • "группа захвата 1" - \d+;любые ранее существующие цифры
    • , поскольку существует только одна группа захвата, по умолчанию используется номер 1
  • /: конечное выражение
0 голосов
/ 03 ноября 2019

Попробуйте выполнить следующую замену:

:%s/-\(\d+\)"$/-0\1"/

Демо

Идея состоит в том, чтобы сопоставить и captureпоследняя цифра в \1, затем создайте замену, используя эту группу захвата, с префиксом ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...