mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 02:15:10 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			79 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # 'grep'
 | |
| 
 | |
| import regex
 | |
| from regex_syntax import *
 | |
| 
 | |
| opt_show_where = 0
 | |
| opt_show_filename = 0
 | |
| opt_show_lineno = 1
 | |
| 
 | |
| def grep(pat, *files):
 | |
| 	return ggrep(RE_SYNTAX_GREP, pat, files)
 | |
| 
 | |
| def egrep(pat, *files):
 | |
| 	return ggrep(RE_SYNTAX_EGREP, pat, files)
 | |
| 
 | |
| def emgrep(pat, *files):
 | |
| 	return ggrep(RE_SYNTAX_EMACS, pat, files)
 | |
| 
 | |
| def ggrep(syntax, pat, files):
 | |
| 	if len(files) == 1 and type(files[0]) == type([]):
 | |
| 		files = files[0]
 | |
| 	global opt_show_filename
 | |
| 	opt_show_filename = (len(files) != 1)
 | |
| 	syntax = regex.set_syntax(syntax)
 | |
| 	try:
 | |
| 		prog = regex.compile(pat)
 | |
| 	finally:
 | |
| 		syntax = regex.set_syntax(syntax)
 | |
| 	for filename in files:
 | |
| 		fp = open(filename, 'r')
 | |
| 		lineno = 0
 | |
| 		while 1:
 | |
| 			line = fp.readline()
 | |
| 			if not line: break
 | |
| 			lineno = lineno + 1
 | |
| 			if prog.search(line) >= 0:
 | |
| 				showline(filename, lineno, line, prog)
 | |
| 		fp.close()
 | |
| 
 | |
| def pgrep(pat, *files):
 | |
| 	if len(files) == 1 and type(files[0]) == type([]):
 | |
| 		files = files[0]
 | |
| 	global opt_show_filename
 | |
| 	opt_show_filename = (len(files) != 1)
 | |
| 	import re
 | |
| 	prog = re.compile(pat)
 | |
| 	for filename in files:
 | |
| 		fp = open(filename, 'r')
 | |
| 		lineno = 0
 | |
| 		while 1:
 | |
| 			line = fp.readline()
 | |
| 			if not line: break
 | |
| 			lineno = lineno + 1
 | |
| 			if prog.search(line):
 | |
| 				showline(filename, lineno, line, prog)
 | |
| 		fp.close()
 | |
| 
 | |
| def showline(filename, lineno, line, prog):
 | |
| 	if line[-1:] == '\n': line = line[:-1]
 | |
| 	if opt_show_lineno:
 | |
| 		prefix = `lineno`.rjust(3) + ': '
 | |
| 	else:
 | |
| 		prefix = ''
 | |
| 	if opt_show_filename:
 | |
| 		prefix = filename + ': ' + prefix
 | |
| 	print prefix + line
 | |
| 	if opt_show_where:
 | |
| 		start, end = prog.regs()[0]
 | |
| 		line = line[:start]
 | |
| 		if '\t' not in line:
 | |
| 			prefix = ' ' * (len(prefix) + start)
 | |
| 		else:
 | |
| 			prefix = ' ' * len(prefix)
 | |
| 			for c in line:
 | |
| 				if c != '\t': c = ' '
 | |
| 				prefix = prefix + c
 | |
| 		if start == end: prefix = prefix + '\\'
 | |
| 		else: prefix = prefix + '^'*(end-start)
 | |
| 		print prefix
 | 
