Skip to main content

Grep implementation with replace

Project description

Build Status
Codacy Badge
codecov

Greptile

Fast grep implementation in python, with replace features

usage: greptile.py [-h] [-v] [-x EXTENSIONS [EXTENSIONS ...]] [-r] [-l] [-i]
                   [-g REPLACE_EXPR] [-f REPLACE_EXPR]
                   expression [file]

file search and replace with regular expressions

positional arguments:
  expression            regular expression
  file                  file path (or directory if -r is used)

optional arguments:
  -h, --help            show this help message and exit
  -v, --version         show program's version number and exit
  -x EXTENSIONS [EXTENSIONS ...], --extensions EXTENSIONS [EXTENSIONS ...]
                        restrict search to file extensions (ex: .py .txt .java
                        .xml)
  -r, --recursive       recursively search in path
  -l, --list            list files matching pattern
  -i, --inplace         update the file inplace (with -g or -f)
  -g REPLACE_EXPR, --replace-global REPLACE_EXPR
                        global replacement expression
  -f REPLACE_EXPR, --replace-first REPLACE_EXPR
                        first occurrence replacement expression

Why fast?

Because it exclusively uses generators, reptile never allocates big lists, it always processes one line in one file at a time. you can do a search on big files and large directories like / recursively without memory overhead.

Examples:

Search "import" in ./greptile.py :

$ ./greptile.py "import" ./greptile.py
import re
import os
import sys
    import argparse

Replacement & easy grouping with python re.sub syntax :

$ greptile.py "\[(.*)\]\((.*)\)" README.md -g "<a href=\"\2\">\1</a>" | diff -u README.md -
--- README.md   2016-04-19 22:37:20.000000000 +0200
+++ -   2016-04-25 14:54:24.000000000 +0200
@@ -1,4 +1,4 @@
-![Agera](https://github.com/google/agera/blob/master/doc/images/agera.png)
+!<a href="https://github.com/google/agera/blob/master/doc/images/agera.png">Agera</a>
 Reactive Programming for Android
 ================================

Api:

import greptile

# Replace "import" by "export" from dir `./`, in all files and these extensions: .py, .xml, .java
greptile.replace('import', 'export', './', '.py', '.xml', '.java')

# Return filenames of all files containing the text "import" from dir `./` and .py, .xml, .java
my_list = greptile.grep_rl('import', './', '.py', '.xml', '.java')

# same as calling replace()
greptile.sed_i(my_list, 'import', 'export')

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page