今天碰到这样一个需求,大概有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打开,然后执行命令\],就得到想要的东西了。
分享到:
相关推荐
command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入 * :r!command:将命令command的输出结果放到当前行 寄存器操作 * "?nyy:将当前行及其下n...
command`:将文件中`n1`行至`n2`行的内容作为`command`的输入并执行之。 - `r!command`:将命令`command`的输出结果放到当前行。 掌握`vi`编辑器的使用,能显著提高在Linux环境下的文本处理效率。虽然初学者可能会...
- :set nomagic:允许在搜索模式中使用未转义的特殊字符 - :set nowrapscan:禁止在搜索到达文件两端时循环 最后行模式命令用于执行高级操作: - :n1,n2 co n3:将n1行到n2行内容复制到n3行下 - :n1,n2 m n3:将n1...
"Vi 编辑器详解" ...Vi 编辑器是一款功能强大且灵活的文本编辑器,通过掌握命令模式、输入模式、末行模式的使用,可以高效地编辑文件,并且可以使用重定向来将命令的执行结果输出到指定的文件中。
在Linux系统中,VI(Visual Editor)是一款强大...通过熟练掌握这些基本命令,你可以有效地在Linux系统中使用VI编辑器进行文本编辑和管理,提高工作效率。记得实践是掌握这些技能的关键,多练习将使你在VI中游刃有余。
6. **查找与替换**:`:/{搜索内容}`查找指定内容,`:s/{原内容}/{新内容}`替换当前行中的内容,`:%s/{原内容}/{新内容}/g`替换整个文件中的所有匹配项。 **环境搭建** 在Linux环境下,通常需要进行一些配置来优化...
要启动Vi并编辑指定文件,只需在命令行输入`vi 文件名`即可。如果文件不存在,则会创建一个新文件;如果文件已存在,则打开并进入编辑状态。 - **进入文本输入模式** 启动Vi后,默认处于命令行模式。要开始输入...
这将会把`/var/qmail/boot/home`目录下的内容中所有出现的`Mailbox`替换成`Maildir/`,并将结果输出到`/var/qmail/rc`文件中。 #### 三、vi/vim 编辑器 **vi**(或其增强版**vim**)是一个功能强大的文本编辑器,在...
- **定位到文件中的特定位置**: - `vi +n filename`:打开文件并定位到第`n`行。 - `vi +/pattern filename`:打开文件并定位到第一个匹配`pattern`的位置。 - **恢复模式**:`vi -r filename`,用于打开最近一次...
command`:将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入。 - `:r!command`:将命令command的输出结果放到当前行。 #### 十、使用示例 例如,创建或...
- **创建并编辑文件**:使用`vi`编辑器输入内容到`numbers`和`chars`文件。 - **显示部分数据**:`cut`命令可以提取`numbers`文件每行的前5个字符。 - **合并文件**:`paste`命令将两个文件连接在一起,使用`@`...
- `/pattern`: 在文件中向下搜索指定的模式。 - `?pattern`: 在文件中向上搜索指定的模式。 - `n`: 重复上一次搜索。 - `N`: 反向重复上一次搜索。 - `:s/pattern/replacement/g`: 替换当前行中所有的匹配模式...
command`:将文件中 n1 行至 n2 行的内容作为 command 的输入并执行之,若不指定 n1,n2,则表示将整个文件内容作为 command 的输入 * `:r!command`:将命令 command 的输出结果放到当前行 寄存器操作 * `"?nyy`:...
利用VI的内置`grep`命令,你可以高效地查找并定位代码中的函数使用。输入查找命令后,直接回车跳转到首个结果,`:cl`列出所有结果,`:cc <编号>`跳转到指定编号的结果,而`<Ctrl> + o`则能返回原来的编辑位置。 5....
在末行模式下,`:s/p1/p2/g`替换当前行中的所有`p1`为`p2`,`:n1,n2s/p1/p2/g`则替换指定行范围内的所有`p1`,`:g/p1/s//p2/g`替换文件中所有`p1`。 `vi`还提供了选项设置,如`all`列出所有设置,`term`设置终端...
command : 将文件中 n1 行至 n2 行的内容作为 command 的输入并执行之,若不指定 n1,n2,则表示将整个文件内容作为 command 的输入 * :r!command : 将命令 command 的输出结果放到当前行 寄存器操作 * "?nyy : 将...
command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入 :r!command:将命令command的输出结果放到当前行 寄存器操作 "?nyy:将当前行及其下n行...
command`可以在VI内部执行外部命令,并查看命令的输出结果。 - 设置选项:`:set option=value`可以设置各种编辑选项,如自动缩进、高亮显示等。 通过以上介绍可以看出,VI编辑器虽然看起来界面简单,但其实功能非常...
command`: 将文件中n1行至n2行的内容作为`command`的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为`command`的输入。 - `:r!command`: 将命令`command`的输出结果放到当前行。 以上就是关于Linux vi编辑...
command` - 将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入。 - `:r!command` - 将命令command的输出结果放到当前行。 #### 十、寄存器操作 - `"?nyy...