mirror of
https://github.com/python/cpython.git
synced 2024-11-28 16:45:42 +01:00
aaab30e00c
(with one small bugfix in bgen/bgen/scantools.py) This replaces string module functions with string methods for the stuff in the Tools directory. Several uses of string.letters etc. are still remaining.
65 lines
1.5 KiB
Python
Executable File
65 lines
1.5 KiB
Python
Executable File
#! /usr/bin/env python
|
|
|
|
"""Reverse grep.
|
|
|
|
Usage: rgrep [-i] pattern file
|
|
"""
|
|
|
|
import sys
|
|
import re
|
|
import getopt
|
|
|
|
def main():
|
|
bufsize = 64*1024
|
|
reflags = 0
|
|
opts, args = getopt.getopt(sys.argv[1:], "i")
|
|
for o, a in opts:
|
|
if o == '-i':
|
|
reflags = reflags | re.IGNORECASE
|
|
if len(args) < 2:
|
|
usage("not enough arguments")
|
|
if len(args) > 2:
|
|
usage("exactly one file argument required")
|
|
pattern, filename = args
|
|
try:
|
|
prog = re.compile(pattern, reflags)
|
|
except re.error, msg:
|
|
usage("error in regular expression: %s" % str(msg))
|
|
try:
|
|
f = open(filename)
|
|
except IOError, msg:
|
|
usage("can't open %s: %s" % (repr(filename), str(msg)), 1)
|
|
f.seek(0, 2)
|
|
pos = f.tell()
|
|
leftover = None
|
|
while pos > 0:
|
|
size = min(pos, bufsize)
|
|
pos = pos - size
|
|
f.seek(pos)
|
|
buffer = f.read(size)
|
|
lines = buffer.split("\n")
|
|
del buffer
|
|
if leftover is None:
|
|
if not lines[-1]:
|
|
del lines[-1]
|
|
else:
|
|
lines[-1] = lines[-1] + leftover
|
|
if pos > 0:
|
|
leftover = lines[0]
|
|
del lines[0]
|
|
else:
|
|
leftover = None
|
|
lines.reverse()
|
|
for line in lines:
|
|
if prog.search(line):
|
|
print line
|
|
|
|
def usage(msg, code=2):
|
|
sys.stdout = sys.stderr
|
|
print msg
|
|
print __doc__
|
|
sys.exit(code)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|