微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

vim – :g显示下面的功能和注释

我不确定这是否可以通过正则表达式实现,所以这里继续并希望最好.

如果我在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和它的早期un​​ix兄弟姐妹是第一个使用正则表达式的程序.

好的,创建一个包含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命令.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐