#!/usr/bin/env python3.8 """ replace stuff in a file or files """ # maybe i should just use https://replace.richardlloyd.org.uk/ import argparse import difflib import fileinput import re import sys cli = argparse.ArgumentParser(description=__doc__) cli.add_argument( "-v", "--verbose", action="store_true", help="print diffs for every replacement" ) cli.add_argument( "-d", "--dry", action="store_true", help="just print what would have happened" ) cli.add_argument( "-r", "--regex", action="store_true", help="use regex instead of literal replace" ) cli.add_argument("old", type=str, help="target string") cli.add_argument("new", type=str, help="replacement string") cli.add_argument( "files", nargs="*", metavar="FILE", help="file(s) to operate on, or omit for stdin", ) args = cli.parse_args() differ = difflib.Differ() def raw(s): return r"{}".format(s) def log(s): sys.stderr.write(s) for line in fileinput.input(files=args.files, inplace=not args.dry): if args.regex: replacement = re.sub(raw(args.old), args.new, line, flags=re.MULTILINE) else: replacement = line.replace(args.old, args.new) if (args.verbose or args.dry) and (line != replacement): diff = list(differ.compare([line], [replacement])) sys.stderr.write(f"{fileinput.filename()}:{fileinput.lineno()}:\n") sys.stderr.writelines(diff) if not args.dry: print(replacement, end="")