史上最全的正则表达式多行匹配例子 from karlzheng@csdn

来源:互联网 发布:聚类算法实践 编辑:程序博客网 时间:2024/06/06 18:56

经常碰到想查找多行匹配的时候,比如:有一份log如下:

commit 0b79912f43f110f64f60aba1244c71c4b0656b4cAuthor: xxx <xxx@758d13f7-6a34-8146-8d86-37c7f849097d>Date:   Mon Oct 22 09:26:30 2012 +0000    usb输出更多的调试信息commit e1d14cca93a417327d78a40a2787cb137ef8ef1dAuthor: zhengkl <zhengkl@758d13f7-6a34-8146-8d86-37c7f849097d>Date:   Mon Oct 22 08:58:04 2012 +0000    修改modem hsic_net_data_handler处理函数commit e02c4740435cd4cbbd1ee7e31b513ffcb03ea906Author: xxx <xxx@758d13f7-6a34-8146-8d86-37c7f849097d>Date:   Mon Oct 22 07:45:02 2012 +0000    lcd add gamma_setting version 1 for ID code 0x1h.    

想实现git log --author zhengkl的功能:

vim脚本:func! MyFindEndLine(linenr)let l:buf_end_line = line('$')let l:line = a:linenrwhile l:line <= l:buf_end_linelet l:line += 1let l:line_buf = getline(l:line)if matchstr(l:line_buf, "^commit") != ""return (l:line - 1)enendwreturn l:buf_end_lineendffunc! MyFindTextBlockFunc(string)let g:mylist = []exec "g /".a:string."/call add(g:mylist, line('.'))"let l:text = []for i in g:mylistlet l:end_line = MyFindEndLine(i)call extend(l:text,  getline(i - 1, l:end_line))call writefile(l:text, "test.txt")endfoendf:call MyFindTextBlockFunc("zhengkl")


awk脚本:#!/bin/awk -f {is_end_file = 1if (match($0, "commit")) {a = $0do {is_end_file = !getlineif (match($0, "zhengkl")) {print aprint $0is_end_file = !getlinewhile (! match($0, "commit")) {print $0is_end_file = getlinea = $0}} else {is_end_file = !getlinea =$0}} while(is_end_file != 1);}}


sed脚本:/^commit/ {: get_commithn/zhengkl/ {Hxp: readagainn/^commit/ {b get_commit}pb readagain}}

当然最方便的还是vim命令:

g/zhengkl/-1;,/commit/-1 write >> test.txt




原创粉丝点击