The RSS
[tips]vim替换技巧一则(数字递增)
原文链接:http://feedproxy.google.com/~r/ch-linghu/~3/gQAzIGA8iGY/310
分类:Linux
TAG:
本文被浏览了469次
作者:令狐虫 | 2010-11-08 17:51:00 | 0评

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

为了保证评论的有效性,我们需要对评论做出审核后进行发布。另外敬请在表单的Approved字段中随便填写一些东西——这是为了防止spam。

Ver 2.0,2009 - 2012,Go4Pro.org
知识共享许可协议
Go4Pro.org is licensed under a Creative Commons 署名-非商业性使用-相同方式共享 3.0 Unported License.
Go4Pro老版请访问:legacy.go4pro.org | Q & A

Valid XHTML 1.0 Transitional  Valid CSS!