Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103682000
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-04-28 10:58:59

原文:用Vim快速分割文本

在网上下了一些txt电子书,整本书就是一个txt文件,文件太大,放到手机上看极其不方便,于是想把它按章节分割开来,分割出来的文件的文件名还要是章节标题,网上应该有这些工具,不过我有Vim了,就用Vim来解决!
就先分割《三国演义》吧,整个txt文件1.2m,用Vim打开,删掉开头无聊的前言,用替换命令把章节标题和内容之间的空行删掉,另存。每一回都是以 “第X回XX”开头,以“且听下文分解。”,就是要把章回分别输出到新文件中,文件名还要是章节标题,用手工一个一个来岂不是累死?为求简便我只提取出几 个章节和删掉大部分内容试验。文章要处理文本我放到文章最后。

昨晚摸索了1个多小时,参考手册查了n次,结果还是失败,找不出什么好方法。到今日才找到好方法,就试用一条键位映射命令。折腾过程很罗嗦,不想看直接跳到最后几行看。

下面都是昨晚失败的过程:
1.用Ex命令
:?^第.*回?,/下文分解。/w .txt
就是把“^第.*回”的行到“下文分解。”的行之间的内容写到新文件中,“.txt”是光标下的字符串作为文件名并加上扩张名 “.txt”,可惜光标这时是移动到那表示输出范围的两行中间,文件名一大串文字,失败。查查有没有得加上偏移量,好像没有, 不用,换成“?^第.*回?.txt”,语法不知道合不合法,结果出错,继续看参考手册,没什么头绪,这个方法光是文件名就不 知道如果解决了,放弃。

因为光标下的字符串是以半个空格分个的,因为标题中问半角空格,所以只输出文件名“第X回”,后边的就不输出了,因此要把半角空格替换换为全角空格,很简单,两条命令
:%s/\(^第.*\) */\1 /gc
:%s/\(^第\S*\) */\1 /gc

2.和上边的差不多,用Ex命令
:?^第.*回?,/下文分解。/w a.txt
然后再用“:e aaa.txt”,打开“aaa.txt”后继续“:w .txt”(也就是第一句),最后“:q”。行是行了,但是实在太没效率了,和手工复制粘贴差不多,怎样继续处理下一个章节又是个问题,放弃。

3. 我想先把一个章回提取出来放到寄存器里,然后输出寄存器的内容,文件名先是随意,确保每个文件名不同就行了,全部输出后,然后把所有文件加到缓冲区,把光 标下的字符串作为文件名输出了,怎样选中一个文件放到寄存器?用查找,不行,替换命令后加上“gc“,不行,在可视模式下查找,不行,哎呀,郁闷。

4.看手册看手册……把上边的3个方法变换一下,不行,改写一下命令,试了n次,还是失败。

郁闷死了,去搜搜有没有类似文章,找不到,再看看别人的Vim文章,看找不着到灵感,最后还是毫无收获,打算去论坛发帖求助,论坛居然没有相关专区,发在Linux专区下吧好像又不是(我搜了一下,也有人发在这个专区),最后又觉得烦了,又累,先睡觉……

下面是今日成功的过程:
今日发了个具有充满奇幻的梦,醒来后,再试试,看看找不找到什么好方法,没想到摸索了几分钟就居然找到好的解决方法,这个方法还真他妈的简单,就一条命令……

把光标移动到文件头,然后切换到可视模式下,按“ip”,这就是选中一个段落,然后按“o”跳到高亮文本的开头(后来试验这步其实可以省去,同样正确输出文件名),光标停留在第一行,这些好办了用Ex命令,自动变成“:’<,’>”,好办,把这段话输出,即是
:'<,'>w .txt
漂亮地输出了一个章节,文件名是这个章节的地标题,然后就是如何输出到下一个了,把这段话用一个键映射一下,用命令
nmap vipo:w .txt
手动移动光标到下一章节标题,然后按一下快捷键,这个不过比复制粘贴快了少少而已。突然先到可以用查找命令来移动光标“/^第”,加进映射中
nmap vipo:w .txt/^第
这 样就可以自动跳到下一个章节标题那一行,省下鼠标移动的麻烦,爽,不过还是要按120下才把整个《三国演义》分割出来。我试试可不可以在前面加个数字n, 表示执行n次,就是比如按“30”后再按键,结果不行,有点郁闷,这时候猛然醒悟,再命令后边再加一个“”如何?

最终命令就是
nmap vipo:w .txt/^第
这样不断循环,试了一下,Vim的窗口唰唰闪动,到最后一次应为出错而自动停止,我娃哈哈哈哈哈哈哈哈……,大功告成,一个键就把整部书漂亮的分割出来了。

解释一下:
nmap:普通模式映射
:映射键为F8
v:进入可视模式
ip:选中一个段落,这里的段落就是以“第XX回”开始,以“且听下文分解”结束,把这段文字选种
o:把光标移动回“第XX回”那一行,以便输出文件名
w .txt:执行写出命令,就是把选种的行输出到新文件,表示光标下的字符串,也就是“第XX回”
/^第:继续查找下一个“第XX回”
:循环

下边就是本文要处理的文本

第一回 宴桃园英雄三结义 斩黄巾英雄首立功
卓问三人现居何职。玄德曰:“白身。”卓甚轻之,不为礼。玄德出,张飞大怒曰:“我等亲赴血战,救了这厮,他却如此无礼。若不杀之,难消我气!”便要提刀入帐来杀董卓。正是:人情势利古犹今,谁识英雄是白身?安得快人如翼德,尽诛世上负心人!毕竟董卓性命如何,且听下文分解。

第二回 张翼德怒鞭督邮 何国舅谋诛宦竖
主薄陈琳曰:“不可!俗云:掩目而捕燕雀,是自欺也,微物尚不可欺以得志,况国家大事乎?今将军仗皇威,掌兵要,龙骧虎步,高下在心:若欲诛宦官,如鼓洪炉燎毛发耳。但当速发雷霆,行权立断,则天人顺之。却反外檄大臣,临犯京阙,英雄聚会,各怀一心:所谓倒持干戈,授人以柄,功必不成,反生乱矣。”何进笑曰:“此懦夫之见也!”傍边一人鼓掌大笑曰:“此事易如反掌,何必多议!”视之,乃曹操也。正是:欲除君侧宵人乱,须听朝中智士谋。不知曹操说出甚话来,且听下文分解。

第三回 议温明董卓叱丁原 馈金珠李肃说吕布
李儒劝卓早定废立之计。卓乃于省中设宴,会集公卿,令吕布将甲士千余,侍卫左右。是日,太傅袁隗与百官皆到。酒行数巡,卓按剑曰“今上暗弱,不可以奉宗庙;吾将依伊尹、霍光故事,废帝为弘农王,立陈留王为帝。有不从者斩!”群臣惶怖莫敢对。中军校尉袁绍挺身出曰:“今上即位未几,并无失德;汝欲废嫡立庶,非反而何?”卓怒曰:“天下事在我!我今为之,谁敢不从!汝视我之剑不利否?”袁绍亦拔剑曰:“汝剑利,吾剑未尝不利!”两个在筵上对敌。正是:丁原仗义身先丧,袁绍争锋势又危。毕竟袁绍性命如何,且听下文分解。

第四回 废汉帝陈留践位 谋董贼孟德献刀
当夜,行数里,月明中敲开客店门投宿。喂饱了马,曹操先睡。陈宫寻思:“我将谓曹操是好人,弃官跟他;原来是个狼心之徒!今日留之,必为后患。”便欲拔剑来杀曹操。正是:设心狠毒非良士,操卓原来一路人。毕竟曹操性命如何,且听下文分解。

第五回 发矫诏诸镇应曹公 破关兵三英战吕布
三人围绕战多时,遮拦架隔无休歇。喊声震动天地翻,杀气迷漫牛斗寒。吕布力穷寻走路,遥望家山拍马还。倒拖画杆方天戟,乱散销金五彩幡。顿断绒绦走赤兔,翻身飞上虎牢关。”三人直赶吕布到关下,看见关上西风飘动青罗伞盖。张飞大叫:“此必董卓!追吕布有甚强处?不如先拿董贼,便是斩草除根!”拍马上关,来擒董卓。正是:擒贼定须擒贼首,奇功端的待奇人。未知胜负如何,且听下文分解。

第六回 焚金阙董卓行凶 匿玉玺孙坚背约
表曰:“汝若要我听信,将随军行李,任我搜看。”坚怒曰:“汝有何力,敢小觑我!”方欲交兵,刘表便退。坚纵马赶去,两山后伏兵齐起,背后蔡瑁、蒯越赶来,将孙坚困在垓心。正是:玉玺得来无用处,反因此宝动刀兵。毕竟孙坚怎地脱身,且听下文分解。

阅读(1129) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~