Заменить ли Vim список слов на другой список слов той же длины? - PullRequest
6 голосов
/ 11 июня 2009

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

Так, например, у вас есть: "А", "б", "в", "г", "д", "е"

И вы хотите заменить каждое слово на заглавную версию каждого слова: "А", "В", "С", "D", "E", "F"

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

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

Есть ли способ как-то сделать одну глобальную замену? Аналогично:

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

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

Ответы [ 2 ]

9 голосов
/ 11 июня 2009

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

: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
3 голосов
/ 11 июня 2009

:% S / (а \ | Ь \ | с \ | d \ | е \ | е) / \ и \ 0 / г * * 1 001

...