[tips]vim替换技巧一则(数字递增)
2010年11月08日 17:51
(本文收录于[go4pro.org])
为了充实自己,把《Dive Into Python 3》用calibre做成了epub版。
可能是自己不太会用吧,一开始做出来的书目录顺序和翻页顺序都不对(似乎它把所有的目录项都按字母排序了,很囧),折腾几次之后未果,后来发现有一个“调整epub”的菜单项,可以把epub分离出来手工编辑,然后再合并回去。于是就不再折腾如何自动生成正确的版本,而是手工调整了一下,效果还不错。
但是当调整toc.ncx时,遇到了一项艰巨的任务:目录项是有一个playOrder属性的,说实在话我不太清楚playOrder的具体作用,因为似乎顺序已经由文本本身给出了,不过我试过这个属性如果留空的话,Aldiko打开会出错。于是,在调整完目录的顺序之后,必须重新生成playOrder。
一个自然的想法是,我把playOrder="xxx"全部清空,比如清空成 playOrder="",然后再通过某个命令重新编号。
前一步很容易:
:s/playOrder="[0-9]\{-}"/playOrder=""/
即可完成。
但是后一步怎么做呢?当然我可以写一个Python脚本什么的也很容易,不过既然我已经用VIM打开,如果能在VIM里完成岂不更好。所幸的是确实有解决之道:
:let i=1|g/playOrder=""/exe "s//playOrder=\"".i."\"/"|let i=i+1
这条命令由三部分组成:let i=1 和 let i=i+1 构成了一个变量递增的循环。我现在无意解释具体的工作原理,总之这样就是一个循环就对了。
关键是中间一句:g命令用于全局查找一个字符串,并对此字符串施加一个命令。比如:
g/\(12\)3/s//\14/ #查找123,并将3替换成4
而在上面的例子里,执行的命令是exe,exe用于执行一个命令,这个命令用一个字符串作为参数传递过来。在这里,这个字符串是:s//playOrder=\"<变量>\",其中变量的部分用字符串拼接的方法将i的值传入。
于是这件事就完成了。
vim很强大,是吧。
1条评论
