:g显示下面的功能和评论

时间:2010-02-15 19:13:02

标签: vim

我不确定这是否可以用正则表达式完成,所以这里就是希望最好的。

如果我在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

有可能吗?

1 个答案:

答案 0 :(得分:12)


:g/^func/.;/^[^!]/-1 print


更新


提出了一个解释......所以这里... vi(1)之所以强大,部分原因在于它是Ken Thompson原始的面向行的ed(1)编辑器的游标寻址扩展。 (ed(1)及其衍生ex在这些年后依然可以在Linux上使用,虽然它是像vi本身那样的克隆形式。)ed和它的早期un​​ix兄弟姐妹是第一个使用正则表达式的程序。 / p>

好的,创建一个包含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 $标识最后一行。大多数命令的默认地址是当前行,但对于globalg命令,它默认为1,$并具有一般形式

addr1, addr2 g /pattern/ any_linemode_command

例如,假设我Jeff但我想责怪Joel日志中不同类型的严重错误。我需要隐身,不要仅仅根据警告线改变杰夫,所以我需要:

g/critical.*error/s/Jeff/Joel/

这将在文件的每一行上运行substitute命令,该文件具有“critical 任何错误”模式,然后将Jeff更改为Joel。

所以现在答案应该是相当清楚的。该命令的工作原理如下:在文件的每一行上,检查行是否以/ ^ func /(行开头的func)开头,如果是,则以.开头(当前行) )然后,将当前地址重置为该行(;),搜索不以!开头的行,如果找到,则从找到的行号中减去1(稍微备份到最后的实际评论)然后只需运行print命令。