[tips]vim替换技巧一则(数字递增)

  令狐虫
  Linux
  2010-11-08
  增加更多TAG »
  5,619次

(本文收录于[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很强大,是吧。


除非另有来自Go4Pro.org或原作者的显式声明,本站点所有文章都按照知识共享许可协议知识共享署名-非商业性使用-禁止演绎 3.0 未本地化版本许可协议进行许可。

Go4Pro.org,V3.0,2009-2014。本站点采用SymfonyBootstrapTwig等技术开发。