如果我在vim,
:g/function
我得到了所有函数行的列表.
现在,我喜欢这个,但是在第一个非评论行之前有评论(!),所以我得到类似的东西:
3 function MyFunction() 4 !This is a comment 5 !This is also a comment 23 function MyOtherFunction() 24 !This is a comment 25 !This is also a comment
有可能吗?
:g/^func/.;/^[^!]/-1 print
更新
提出了一个解释……所以这里… vi(1)之所以强大,部分原因在于它是Ken Thompson原始的面向行的ed(1)编辑器的游标寻址扩展. (ed(1)及其衍生版本在这些年之后仍然可以在Linux上使用,虽然它是像vi本身那样的克隆形式.)ed和它的早期unix兄弟姐妹是第一个使用正则表达式的程序.
好的,创建一个包含26行左右的文件,每个字母对应一个字母,然后启动vi,ed或ex. (对于ed或ex,请忽略:字符.)尝试:
:1;/m/p
vi命令的一般形式是:addr,addr2 commmand
在我的例子中,命令只是p用于打印. addr1和addr2通常是行号或正则表达式使用/ re /向下搜索或者?向上搜索.试试/ c /; / g / p,它提示我解释一下:导致编辑器在评估第二个地址之前切换到第一个地址找到的行.它在默认的包裹扫描模式下并不总是重要,但是如果你键入:set nows(不在ed中),那么搜索模式将不会包装和之间的区别,和;变大了
在我的例子中没有使用最重要的行模式命令,但是应该在这里提到:s / pattern / replacement /或:s / pattern / replacement / g.此命令当然可以使用地址,因此典型命令为1,$s / old / new / g $标识最后一行.大多数命令的默认地址是当前行,但对于global或g命令,它默认为1,$并具有常规形式
addr1,addr2 g /pattern/ any_linemode_command
例如,假设我是Jeff,但我想将Joel归咎于日志中不同类型的严重错误.我需要隐身,不要仅仅根据警告线改变杰夫,所以我需要:
g/critical.*error/s/Jeff/Joel/
这将在文件的每一行上运行substitute命令,该模式具有“critical anything error”模式,然后将Jeff更改为Joel.
所以现在答案应该是相当清楚的.该命令的工作原理如下:在文件的每一行上,检查该行是否以/ ^ func /(行开头的func)开头,如果是,则以.开头. (当前行)然后,将当前地址重置为该行(;)搜索不以!开头的行,如果找到,则从找到的行号中减去1(稍微备份到上一个实际注释)然后只需运行print命令.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。