Замена Vim списка слов другим списком слов такой же длины?

StackOverflow https://stackoverflow.com/questions/978393

Вопрос

Мне нужно заменить список слов на такой же длинный список слов.

Например, у вас есть:«а», «б», «в», «г», «е», «е»

И вы хотите заменить каждое слово версией каждого слова в верхнем регистре:«А», «Б», «В», «Г», «Е», «Ж»

Я знаю, как найти каждую строку с помощью регулярного выражения:(а\|b\|c\|d\|e\|f)

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

Есть ли способ как-то сделать одну глобальную замену?Похожий на:

:%s/\(a\|b\|c\|d\|e\|f\)/INSERT_REPLACEMENT_LIST/

Я не уверен, возможно ли это вообще.

Это было полезно?

Решение

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

:let r={'a':'A', 'b':'B', 'c':'C', 'd':'D', 'e':'E'}
:%s/\v(a|b|c|d|e)/\=r[submatch(1)]/g

Видеть :h sub-replace-\= и :h submatch().Если вы хотите втиснуть это в одну строку, вы можете использовать буквальный словарь.

:%s/\v(a|b|c|d|e)/\={'a':'A','b':'B','c':'C','d':'D','e':'E'}[submatch(1)]/g

Конкретный пример, который вы привели с прописными буквами, было бы проще сделать так:

:%s/[a-e]/\U\0/g

Другие советы

:%s/(a\|b\|c\|d\|e\|f)/\U\0/g

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top