formerly known as Python Mass Editor
Implements a python mass editor to process text files using Python code. The modification(s) is (are) shown on stdout as a diff output. One can then modify the target file(s) in place with the -w/--write option. This is very similar to 2to3 tool that ships with Python 3.
WARNING: A word of caution about the usage of eval() |
This tool is useful as far as it goes but it does rely on the python
See Ned Batchelder's article for a thorough discussion of the dangers
linked to |
You probably will need to know the basics of the Python re module (regular expressions).
usage: massedit.py [-h] [-V] [-w] [-v] [-e EXPRESSIONS] [-f FUNCTIONS]
[-x EXECUTABLES] [-s START_DIRS] [-m MAX_DEPTH] [-o FILE]
[-g FILE] [--encoding ENCODING] [--newline NEWLINE]
[file pattern [file pattern ...]]
Python mass editor
positional arguments:
file pattern shell-like file name patterns to process or - to read
from stdin.
optional arguments:
-h, --help show this help message and exit
-V, --version show program's version number and exit
-w, --write modify target file(s) in place. Shows diff otherwise.
-v, --verbose increases log verbosity (can be specified multiple
times)
-e EXPRESSIONS, --expression EXPRESSIONS
Python expressions applied to target files. Use the
line variable to reference the current line.
-f FUNCTIONS, --function FUNCTIONS
Python function to apply to target file. Takes file
content as input and yield lines. Specify function as
[module]:?<function name>.
-x EXECUTABLES, --executable EXECUTABLES
Python executable to apply to target file.
-s START_DIRS, --start START_DIRS
Directory(ies) from which to look for targets.
-m MAX_DEPTH, --max-depth-level MAX_DEPTH
Maximum depth when walking subdirectories.
-o FILE, --output FILE
redirect output to a file
-g FILE, --generate FILE
generate stub file suitable for -f option
--encoding ENCODING Encoding of input and output files
--newline NEWLINE Newline character for output files
Examples:
# Simple string substitution (-e). Will show a diff. No changes applied.
massedit.py -e "re.sub('failIf', 'assertFalse', line)" *.py
# File level modifications (-f). Overwrites the files in place (-w).
massedit.py -w -f fixer:fixit *.py
# Will change all test*.py in subdirectories of tests.
massedit.py -e "re.sub('failIf', 'assertFalse', line)" -s tests test*.py
# Will transform virtual methods (almost) to MOCK_METHOD suitable for gmock (see https://github.com/google/googletest).
massedit.py -e "re.sub(r's*virtuals+([w:<>,s&*]+)s+(w+)(([^)]*))s*((w+)*)(=s*0)?;', 'MOCK_METHOD(g<1>, g<2>, g<3>, (g<4>, override));', line)" gmock_test.cpp
If massedit is installed as a package (from pypi for instance), one can interact with it as a command line tool:
python -m massedit -e "re.sub('assertEquals', 'assertEqual', line)" test.py
Or as a library (command line option above to be passed as kewyord arguments):
>>> import massedit
>>> filenames = ['massedit.py']
>>> massedit.edit_files(filenames, ["re.sub('Jerome', 'J.', line)"])
Lastly, there is a convenient massedit.bat wrapper for Windows included in
the distribution.
Download massedit.py from http://github.com/elmotec/massedit or :
python -m pip install massedit
I find myself using massedit mostly for source to source modification of large code bases like this:
First create a fixer.py python module with the function that will
process your source code. For instance, to add a header:
def add_header(lines, file_name):
yield '// This is my header' # will be the first line of the file.
for line in lines:
yield line
Adds the location of fixer.py to your $PYTHONPATH, then simply
call massedit.py like this:
massedit.py -f fixer:add_header *.h
You can add the -s . option to process all the .h files reccursively.
I have been using runsed and checksed (from Unix Power Tools) for years and did not find a good substitute under Windows until I came across Graham Fawcett python recipe 437932 on ActiveState. It inspired me to write the massedit.
The core was fleshed up a little, and here we are. If you find it useful and enhance it please, do not forget to submit patches. Thanks!
If you are more interested in awk-like tool, you probably will find pyp a better alternative.
To set things up for development, the easiest is to pip-install the develop extra configuration:
python -m venv venv . venv/bin/activate python -m pip install -e .[develop]
The best is to use commitizen when performing commits.
Licensed under the term of MIT License. See attached file LICENSE.txt.
See CHANGELOG.md for changes later than 0.69.0
https://github.com/myint https://github.com/tgoodlet https://github.com/ALFNeT https://github.com/isidroas