我不确定这是否可以通过正则表达式实现,所以这里继续并希望最好.
如果我在vim,
:g/function
Run Code Online (Sandbox Code Playgroud)
我得到了所有函数行的列表.
现在,我喜欢这个,但是在第一个非评论行之前有评论(!),所以我得到类似的东西:
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
Run Code Online (Sandbox Code Playgroud)
有可能吗?
Dig*_*oss 12
:g/^func/.;/^[^!]/-1 print
Run Code Online (Sandbox Code Playgroud)
更新
提出了一个解释......所以这里... vi(1)之所以强大,部分原因在于它是Ken Thompson原始的面向行的ed(1)编辑器的游标寻址扩展.(ed(1)及其衍生ex产品在这些年后依然可以在Linux上使用,虽然它是像vi本身那样的克隆形式.)ed和它的早期unix兄弟姐妹是第一个使用正则表达式的程序.
好的,创建一个包含26行左右的文件,每个字母对应一个字母,然后启动vi,ed或ex.(对于ed或ex,请忽略:字符.)尝试:
:1;/m/p
Run Code Online (Sandbox Code Playgroud)
vi命令的一般形式是:addr,addr2 commmand
在我的例子中,该命令仅p用于打印.addr1和addr2通常是行号或正则表达式使用/ re /向下搜索或者?向上搜索.尝试/c/;/g/p提示我解释:;导致编辑器在评估第二个地址之前切换到第一个地址找到的行.它并不总是重要的默认选项为真模式,但如果你输入:set nows(不是在编),然后搜索模式将不换之间的差异,,并;变得更大.
在我的示例中没有使用最重要的行模式命令,但应在此处提及::s/pattern/replacement/或:s/pattern/replacement/g.当然,本命令才能地址,以便典型的命令是1,$s/old/new/g所述$识别的最后一行.大多数命令的默认地址是当前行,但对于默认的global或g命令,它是默认地址1,$并具有常规格式
addr1, addr2 g /pattern/ any_linemode_command
Run Code Online (Sandbox Code Playgroud)
例如,说我是杰夫,但我想责怪Joel在日志中存在不同类型的严重错误.我需要隐身,不要仅仅根据警告线改变杰夫,所以我需要:
g/critical.*error/s/Jeff/Joel/
Run Code Online (Sandbox Code Playgroud)
这将在文件的每一行上运行substitute命令,该模式具有"critical anything error"模式,然后将Jeff更改为Joel.
所以现在答案应该是相当清楚的.该命令的工作原理如下:在文件的每一行上,检查行是否以/ ^ func /(行开头的func)开头,如果是,则从.(当前行)开始,然后重置该行的当前地址(;)搜索不以该行开头的行,!如果找到,则从找到的行号中减去一行(稍微备份到最后一个实际注释),然后运行该print命令.
| 归档时间: |
|
| 查看次数: |
449 次 |
| 最近记录: |