#!/usr/bin/env python """ colgrep: Interactive grep-like tool that hi-lights results. Usage: colgrep [-d] [files] """ import re import sys COLSTRING="\x1b[%sm" def main(): debug = 0 if '-d' in sys.argv: debug = 1 sys.argv.remove("-d") # FIXME: Error check regexp = sys.argv[1] prog = re.compile(regexp) errs = [prog.groupindex[key] for key in prog.groupindex.keys() if key.startswith("err")] for fn in sys.argv[2:]: f = open(fn) for line in f.readlines(): line = line[:-1] match = prog.search(line) if match: starts = {} ends = {} if prog.groups == 0: starts.setdefault(match.start(), []).append(1) ends.setdefault(match.end() - 1, []).insert(0,1) else: cnt = 1 for group in match.groups(): col = "" if cnt in errs: col = COLSTRING % (41 + (cnt % 5)) else: col += COLSTRING % (31 + (cnt % 5)) if group is not None and group != "": starts.setdefault(match.start(cnt), []).append(col) ends.setdefault(match.end(cnt) - 1, []).insert(0,col) cnt += 1 cnt = 0 color_stack = [0] sys.stdout.write("%-60s| " % fn) for ch in line: if cnt in starts: for color in starts[cnt]: color_stack.append(color) sys.stdout.write('%s' % color_stack[-1]) if debug: sys.stdout.write("{") del starts[cnt] sys.stdout.write(ch) if cnt in ends: for x in ends[cnt]: del color_stack[-1] if debug: sys.stdout.write("}") sys.stdout.write('\x1b[%sm' % color_stack[-1]) del ends[cnt] cnt += 1 sys.stdout.write("\n") if __name__ == "__main__": main()