#!/usr/bin/python3 import argparse import re import sys def main(): p = argparse.ArgumentParser(description="Paragraph grep") p.add_argument('regexp', type=re.compile) p.add_argument('infile', nargs='*') opts = p.parse_args() for infile in (map(open, opts.infile) if opts.infile else [sys.stdin]): with infile: # XXX closes sys.stdin, which should be OK paragrep(opts.regexp, infile, sys.stdout) def paragrep(regexp, infile, outfile): "Write paragraphs from infile matching regexp to outfile." for para in paragraphs(infile): if any(regexp.search(s) for s in para): outfile.writelines(para) def paragraphs(lines): para = [] for line in lines: para.append(line) if not line.strip(): yield para para = [] yield para if __name__ == '__main__': main()