blob: bdefbe6c34b19b233ca194c932e0623d0d34c47b [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):
Guido van Rossume9cde311992-01-12 23:33:52 +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):
Guido van Rossume9cde311992-01-12 23:33:52 +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):
Guido van Rossume9cde311992-01-12 23:33:52 +000017 return ggrep(RE_SYNTAX_EMACS, pat, files)
18
19def ggrep(syntax, pat, files):
20 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)
Guido van Rossum5fca8a11991-12-31 00:00:35 +000024 syntax = regex.set_syntax(syntax)
25 try:
26 prog = regex.compile(pat)
27 finally:
28 syntax = regex.set_syntax(syntax)
Guido van Rossume9cde311992-01-12 23:33:52 +000029 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()
39
Guido van Rossum8566e471997-10-22 20:44:58 +000040def pgrep(pat, *files):
41 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()
57
Guido van Rossume9cde311992-01-12 23:33:52 +000058def showline(filename, lineno, line, prog):
59 if line[-1:] == '\n': line = line[:-1]
60 if opt_show_lineno:
Sjoerd Mullender62f1a232001-02-09 16:34:24 +000061 prefix = `lineno`.rjust(3) + ': '
Guido van Rossume9cde311992-01-12 23:33:52 +000062 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:
Fred Drake132dce22000-12-12 23:11:42 +000075 if c != '\t': c = ' '
Guido van Rossume9cde311992-01-12 23:33:52 +000076 prefix = prefix + c
77 if start == end: prefix = prefix + '\\'
78 else: prefix = prefix + '^'*(end-start)
79 print prefix