VIM搜索和替换

时间:2011-10-07 07:19:10

标签: vim

我正在做一些拼图,其中每个英文字符被2个字符高级替换。例如,“apple”将被写为“crrng”a + 2 = c,...并且类似于pple。在python maketrans我能够做到。

我想知道在VIM搜索中是否可能出现类似情况。替换??

任何想法???

4 个答案:

答案 0 :(得分:10)

如果字母字符按顺序排列在目标中 编码 1 ,使用以下替换命令 2

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

然而,这种替换实现了非圆形字母移位。一个圆形 shift可以通过分别处理小写的两个替换来实现 和大写字母。

:%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 :(得分:1)

是的,\=将执行函数

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

答案 2 :(得分:0)

无法想到vim中的任何内容,但您可以使用unix命令行实用程序'tr'(我相信代表翻译)。

答案 3 :(得分:0)

您描述的谜题被广泛称为凯撒密码,通常通过tr命令或sed -e y/实现。由于y在vim中不可用,你需要像ib提出的那样非常脏的黑客,但是调用tr是更好的工作。

特别是考虑y和z的角点情况:我认为这些应该分别映射到a和b?