| # '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 |