blob: 292674676bb517a0b95f3f2d410f43a4ae7f7827 [file] [log] [blame]
Guido van Rossum217a5fa1990-12-26 15:40:07 +00001# 'grep'
2
Guido van Rossum5fca8a11991-12-31 00:00:35 +00003import regex
4from regex_syntax import *
Guido van Rossum217a5fa1990-12-26 15:40:07 +00005
Guido van Rossume9cde311992-01-12 23:33:52 +00006opt_show_where = 0
7opt_show_filename = 0
8opt_show_lineno = 1
Guido van Rossum5fca8a11991-12-31 00:00:35 +00009
Guido van Rossum6a1f0891992-04-06 14:03:53 +000010def grep(pat, *files):
Tim Peters182b5ac2004-07-18 06:16:08 +000011 return ggrep(RE_SYNTAX_GREP, pat, files)
Guido van Rossum5fca8a11991-12-31 00:00:35 +000012
Guido van Rossum6a1f0891992-04-06 14:03:53 +000013def egrep(pat, *files):
Tim Peters182b5ac2004-07-18 06:16:08 +000014 return ggrep(RE_SYNTAX_EGREP, pat, files)
Guido van Rossum5fca8a11991-12-31 00:00:35 +000015
Guido van Rossum6a1f0891992-04-06 14:03:53 +000016def emgrep(pat, *files):
Tim Peters182b5ac2004-07-18 06:16:08 +000017 return ggrep(RE_SYNTAX_EMACS, pat, files)
Guido van Rossume9cde311992-01-12 23:33:52 +000018
19def ggrep(syntax, pat, files):
Tim Peters182b5ac2004-07-18 06:16:08 +000020 if len(files) == 1 and type(files[0]) == type([]):
21 files = files[0]
22 global opt_show_filename
23 opt_show_filename = (len(files) != 1)
24 syntax = regex.set_syntax(syntax)
25 try:
26 prog = regex.compile(pat)
27 finally:
28 syntax = regex.set_syntax(syntax)
29 for filename in files:
30 fp = open(filename, 'r')
31 lineno = 0
32 while 1:
33 line = fp.readline()
34 if not line: break
35 lineno = lineno + 1
36 if prog.search(line) >= 0:
37 showline(filename, lineno, line, prog)
38 fp.close()
Guido van Rossume9cde311992-01-12 23:33:52 +000039
Guido van Rossum8566e471997-10-22 20:44:58 +000040def pgrep(pat, *files):
Tim Peters182b5ac2004-07-18 06:16:08 +000041 if len(files) == 1 and type(files[0]) == type([]):
42 files = files[0]
43 global opt_show_filename
44 opt_show_filename = (len(files) != 1)
45 import re
46 prog = re.compile(pat)
47 for filename in files:
48 fp = open(filename, 'r')
49 lineno = 0
50 while 1:
51 line = fp.readline()
52 if not line: break
53 lineno = lineno + 1
54 if prog.search(line):
55 showline(filename, lineno, line, prog)
56 fp.close()
Guido van Rossum8566e471997-10-22 20:44:58 +000057
Guido van Rossume9cde311992-01-12 23:33:52 +000058def showline(filename, lineno, line, prog):
Tim Peters182b5ac2004-07-18 06:16:08 +000059 if line[-1:] == '\n': line = line[:-1]
60 if opt_show_lineno:
61 prefix = `lineno`.rjust(3) + ': '
62 else:
63 prefix = ''
64 if opt_show_filename:
65 prefix = filename + ': ' + prefix
66 print prefix + line
67 if opt_show_where:
68 start, end = prog.regs()[0]
69 line = line[:start]
70 if '\t' not in line:
71 prefix = ' ' * (len(prefix) + start)
72 else:
73 prefix = ' ' * len(prefix)
74 for c in line:
75 if c != '\t': c = ' '
76 prefix = prefix + c
77 if start == end: prefix = prefix + '\\'
78 else: prefix = prefix + '^'*(end-start)
79 print prefix