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

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

commit 0b79912f43f110f64f60aba1244c71c4b0656b4c
Author: xxx <xxx@758d13f7-6a34-8146-8d86-37c7f849097d>
Date:   Mon Oct 22 09:26:30 2012 +0000

    usb输出更多的调试信息

commit e1d14cca93a417327d78a40a2787cb137ef8ef1d
Author: zhengkl <zhengkl@758d13f7-6a34-8146-8d86-37c7f849097d>
Date:   Mon Oct 22 08:58:04 2012 +0000

    修改modem hsic_net_data_handler处理函数

commit e02c4740435cd4cbbd1ee7e31b513ffcb03ea906
Author: 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:linenr
	while l:line <= l:buf_end_line
		let l:line += 1
		let l:line_buf = getline(l:line)
		if matchstr(l:line_buf, "^commit") != ""
			return (l:line - 1)
		en
	endw
	return l:buf_end_line
endf
func! MyFindTextBlockFunc(string)
	let g:mylist = []
	exec "g /".a:string."/call add(g:mylist, line('.'))"
	let l:text = []
	for i in g:mylist
		let l:end_line = MyFindEndLine(i)
		call extend(l:text,  getline(i - 1, l:end_line))
		call writefile(l:text, "test.txt")
	endfo
endf

:call MyFindTextBlockFunc("zhengkl")


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


sed脚本:
/^commit/ {
		: get_commit
		h
		n
		/zhengkl/ {
				H
				x
				p
				: readagain
				n
				/^commit/ {
					b get_commit
				}
				p
				b readagain
		}
}

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

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,要进行完全匹配,可以使用re模块的match函数,结合正则表达式进行匹配。首先,引用中提到,正则表达式是一种字符串匹配的模式,更像是一种逻辑公式。在Python中,正则表达式匹配可以使用re模块的match函数。引用中提到,使用re.match函数可以从字符串的首字母开始匹配,如果字符串包含该正则表达式的子串,则匹配成功,返回一个Match对象,否则返回None。要进行完全匹配,可以在正则表达式的末尾加上$符号。下面是一个示例代码,使用正则表达式进行完全匹配: ```python import re pattern = r'^张\w$' name = '张三' if re.match(pattern, name): print('{},你好!'.format(name)) ``` 运行上述代码,如果name为'张三',则输出'张三,你好!',表示完全匹配成功。引用中的示例代码展示了如何使用re.match进行正则表达式匹配。引用中的示例代码使用了\w来表示匹配一个字母、数字或下划线字符,^表示匹配字符串的开头,$表示匹配字符串的结尾。 希望这个回答对您有所帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Python正则表达式(一看就懂)](https://blog.csdn.net/m0_64036070/article/details/123853489)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [python正则表达式查找匹配项并进行替换](https://blog.csdn.net/EaSoNgo111/article/details/129703692)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值