summaryrefslogtreecommitdiff
path: root/replace
diff options
context:
space:
mode:
authorBen Sima <ben@bsima.me>2020-04-18 10:16:50 -0700
committerBen Sima <ben@bsima.me>2020-04-18 10:16:50 -0700
commit0771324e14c9602286b4de71c036447d5ad835eb (patch)
tree46bcfa83d3be0ee310e4f6dd19e98b580189d2ba /replace
parent864985c5e02f70566f7c9f2326f0a9be7f6300e6 (diff)
Create replace script
Diffstat (limited to 'replace')
-rwxr-xr-xreplace30
1 files changed, 30 insertions, 0 deletions
diff --git a/replace b/replace
new file mode 100755
index 0000000..ea14088
--- /dev/null
+++ b/replace
@@ -0,0 +1,30 @@
+#!/usr/bin/env python
+"""
+replace stuff in a file or files
+"""
+import argparse
+import difflib
+import glob
+import fileinput
+import sys
+
+cli = argparse.ArgumentParser(description=__doc__)
+cli.add_argument(
+ "-v", "--verbose", action="store_true", help="print diffs for every replacement"
+)
+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="files to operate on, or omit for stdin",
+)
+args = cli.parse_args()
+
+differ = difflib.Differ()
+
+for line in fileinput.input(files=args.files, inplace=True):
+ replacement = line.replace(args.old, args.new)
+ print(replacement, end="")
+ if args.verbose and args.old in line:
+ diff = list(differ.compare([line], [replacement]))
+ sys.stderr.write(f"{fileinput.filename()}:{fileinput.lineno()}:\n")
+ sys.stderr.writelines(diff)