VIM поиск и замена - PullRequest
       1

VIM поиск и замена

6 голосов
/ 07 октября 2011

Я делал какую-то головоломку, где каждый английский символ заменяется на 2 продвинутых символа.Например, «яблоко» будет записано как «crrng» a + 2 = c, ... и аналогично для pple.В python maketrans я смог это сделать.

Мне было интересно, возможно ли подобное в VIM-поиске и замене ??

Есть идеи ???

Ответы [ 4 ]

10 голосов
/ 07 октября 2011

Если буквенные символы расположены последовательно в цели кодирование 1 , используйте следующую команду подстановки 2 .

:%s/./\=nr2char(char2nr(submatch(0))+2)/g

Однако эта замена реализует некруговое смещение букв. Циркуляр сдвиг может быть реализован двумя заменами, отдельно обрабатывая строчные буквы и заглавные буквы.

:%s/\l/\=nr2char(char2nr('a') + (char2nr(submatch(0)) - char2nr('a') + 2) % 26)/g
:%s/\u/\=nr2char(char2nr('A') + (char2nr(submatch(0)) - char2nr('A') + 2) % 26)/g

Другим способом является перевод символов с помощью функции tr(). Позволь нам предположим, что переменная a содержит строчные буквы алфавита расположены в правильном порядке, а переменная a1 содержит строку символов соответствует значениям в a (ниже приведен пример для английских букв).

:let a = 'abcdefghijklmnopqrstuvwxyz'
:let a1 = a[2:] . a[:1]

Чтобы не вводить весь алфавит вручную, можно получить значение a следующим образом,

:let a = join(map(range(char2nr('a'), char2nr('z')), 'nr2char(v:val)'), '')

Затем, чтобы заменить каждую букву в строке буквой на две позиции вниз алфавит, используйте подстановку

:%s/.*/\=tr(submatch(0), a . toupper(a), a1 . toupper(a1))

1 Это верно для ASCII и некоторых алфавитов в UTF-8, например, Английский.

2 Перед запуском команды убедитесь, что опция encoding устанавливается соответственно.

1 голос
/ 07 октября 2011

Да, \= выполнит функцию

%s/\(.\)/\=nr2char(char2nr(submatch(1)) + 2)/g
0 голосов
/ 07 октября 2011

Головоломка, которую вы описываете, широко известна как шифр Цезаря и обычно реализуется с помощью команды tr или sed -e y/.Так как y недоступен в vim, вам понадобится довольно грязный хак, как предложил ib, но вызов tr - намного более приятная работа.

Особенно учитывая угловой случай y и z: я предполагаю, что они должны быть отображеныа и б соответственно?

0 голосов
/ 07 октября 2011

Ничего не могу придумать в vim, но вы можете использовать утилиту командной строки unix 'tr' (я полагаю, переводчик).

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