使用vi查找文件中指定内容并输出到文件

来源:互联网 时间:1970-01-01

今天碰到这样一个需求,大概有100多个文件,需要从这些文件里面找到一些具有相同格式的代码,然后把他们统一输入到一个txt中去。拿到需求后,我的第一个想法就是使用vi,于是就尝试了一下,得到了一个不是很好的解决方案,如下:

:set nows
:map /1 gg:.,.write >> c:/temp.txt<CR>/2
:map /2 /^[ /t]*form <CR>ma/^[ /t]*with frame .*/.<CR>mb:'a,'bwrite >> c:temp.txt<CR>/2
:map /] :n<CR>/1

set nows
是用来关闭循环搜索的,vi默认会循环搜索一个文件,这样的话,我们就没有结束的条件了,所以要关闭它。

map /1 gg:.,.write >> c:/temp.txt<CR>/2
用来map一个命令/1,gg代表到第一行,:.,.表示复制第一行,write>>c:/temp.txt<CR>表示写到一个文件,/2是之后还会map的一个命令。注意到,因为需求的细节里面有要求把找到的代码和它们所在的文件名做关联的要求,而所处理的文件第一行是包含文件名的注释,所以这样做可以达到要求。另外,输出时使用了绝对路径,这是因为需要处理多个文件,而vi在多文件编辑模式下之只能读写绝对路径文件,这也是对的,因为如果编辑的文件处在不同目录,那么相对路径就是不定的了。

map /2 /^[ /t]*form <CR>ma/^[ /t]*with frame .*/.<CR>mb:'a,'bwrite >> c:temp.txt<CR>/2
用来map一个命令/2,/^[ /t]*form <CR>表示寻找一个文本模式,ma表示把找到的那一行标记为a,/^[ /t]*with frame .*/.<CR>表示寻找另一个文本模式,mb表示把找到的那一行标记为b,:'a,'b表示复制a和b之间的文本,write >> c:temp.txt<CR>表示输出到文件,/2表示循环调用/2直到找不到文本模式(这就是为什么要set nows的原因)。

map /] /1<CR>:n<CR>/]
用来map一个命令/],/1表示查找文本模式并输出到文件,:n<CR>表示切换到下一个文件,/]表示循环调用/]直到没有下一个文件存在。

做好这些setting和map之后,把需要处理的文件用一个vi打开,然后执行命令/],就得到想要的东西了。



相关阅读:
Top