mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			79 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
	
		
			2.1 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
 |