Замена Vim списка слов другим списком слов такой же длины?
-
13-09-2019 - |
Вопрос
Мне нужно заменить список слов на такой же длинный список слов.
Например, у вас есть:«а», «б», «в», «г», «е», «е»
И вы хотите заменить каждое слово версией каждого слова в верхнем регистре:«А», «Б», «В», «Г», «Е», «Ж»
Я знаю, как найти каждую строку с помощью регулярного выражения:(а\|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