[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条评论

gravatar for 陈
你好,如果替换成的不是递增的数字,而是一个list里的项要如何呢?比如要将playOrder="XXX"替换成playOrder="ab",playOrder="cd",playOrder="ef"... (Email) - 2011年07月20日 12:07




Remember personal info?
Notify
Hide email
Small print: All html tags except <b> and <i> will be removed from your comment. You can make links by just typing the url or mail-address.
Design downloaded from free website templates.