首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Vim中实现类似Caesar密码的文本替换?

如何在Vim中实现类似Caesar密码的文本替换?
EN

Stack Overflow用户
提问于 2011-10-07 15:19:10
回答 4查看 1.6K关注 0票数 7

我在做一些拼图游戏,每个英文字母都被字母表中的两个字母所取代。例如,单词apple要转换为crrng,如a + 2 → cb + 2 → d等。

在Python语言中,我能够使用maketrans()字符串方法实现这种转换。我想知道:在Vim中有没有可能通过搜索和替换来做同样的事情?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-07 15:26:31

如果字母字符在目标编码中按顺序排列(就像ASCII码和一些-8中的字母表一样,如英语),则可以使用以下替换命令:

代码语言:javascript
复制
:%s/./\=nr2char(char2nr(submatch(0))+2)/g

(在运行该命令之前,请确保相应地设置了encoding选项。)

但是,此替换实现了非循环字母移位。循环移位可以通过分别处理小写和大写字母的两个替换来实现:

代码语言:javascript
复制
:%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

2.另一种方法是使用tr()函数转换字符。让我们假设变量a包含按正确顺序排列的字母表的小写字符,变量a1保存与a中的字符串相对应的字符串(下面是英文字母的示例)。

代码语言:javascript
复制
:let a = 'abcdefghijklmnopqrstuvwxyz'
:let a1 = a[2:] . a[:1]

为了避免手工输入整个字母表,可以按如下方式生成a的值:

代码语言:javascript
复制
:let a = join(map(range(char2nr('a'), char2nr('z')), 'nr2char(v:val)'), '')

然后,要将一行中的每个字母替换为字母表中两个位置的字母,可以使用以下替换:

代码语言:javascript
复制
:%s/.*/\=tr(submatch(0), a . toupper(a), a1 . toupper(a1))
票数 10
EN

Stack Overflow用户

发布于 2011-10-07 15:31:29

是,\=将执行函数

代码语言:javascript
复制
%s/\(.\)/\=nr2char(char2nr(submatch(1)) + 2)/g
票数 2
EN

Stack Overflow用户

发布于 2011-10-07 15:26:04

在vim中我想不到任何东西,但你可以使用unix命令行实用程序'tr‘(我相信它代表翻译)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7684168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档