|
Packit |
9c2278 |
#!/usr/bin/python
|
|
Packit |
9c2278 |
#
|
|
Packit |
9c2278 |
# Simple utility script to manipulate
|
|
Packit |
9c2278 |
# certain types of strings in a file
|
|
Packit |
9c2278 |
|
|
Packit |
9c2278 |
# This can be used in various projects where
|
|
Packit |
9c2278 |
# there is the need to replace strings in files,
|
|
Packit |
9c2278 |
# and is copied from GLib's $(srcroot)/build/win32
|
|
Packit |
9c2278 |
|
|
Packit |
9c2278 |
# Author: Fan, Chun-wei
|
|
Packit |
9c2278 |
# Date: September 03, 2014
|
|
Packit |
9c2278 |
|
|
Packit |
9c2278 |
import os
|
|
Packit |
9c2278 |
import sys
|
|
Packit |
9c2278 |
import re
|
|
Packit |
9c2278 |
import string
|
|
Packit |
9c2278 |
import argparse
|
|
Packit |
9c2278 |
|
|
Packit |
9c2278 |
valid_actions = ['remove-prefix',
|
|
Packit |
9c2278 |
'replace-var',
|
|
Packit |
9c2278 |
'replace-str',
|
|
Packit |
9c2278 |
'remove-str']
|
|
Packit |
9c2278 |
|
|
Packit |
9c2278 |
def replace_multi(src, dest, replace_items):
|
|
Packit |
9c2278 |
with open(src, 'r') as s:
|
|
Packit |
9c2278 |
with open(dest, 'w') as d:
|
|
Packit |
9c2278 |
for line in s:
|
|
Packit |
9c2278 |
replace_dict = dict((re.escape(key), value) \
|
|
Packit |
9c2278 |
for key, value in replace_items.items())
|
|
Packit |
9c2278 |
replace_pattern = re.compile("|".join(replace_dict.keys()))
|
|
Packit |
9c2278 |
d.write(replace_pattern.sub(lambda m: \
|
|
Packit |
9c2278 |
replace_dict[re.escape(m.group(0))], line))
|
|
Packit |
9c2278 |
|
|
Packit |
9c2278 |
def replace(src, dest, instring, outstring):
|
|
Packit |
9c2278 |
replace_item = {instring: outstring}
|
|
Packit |
9c2278 |
replace_multi(src, dest, replace_item)
|
|
Packit |
9c2278 |
|
|
Packit |
9c2278 |
def check_required_args(args, params):
|
|
Packit |
9c2278 |
for param in params:
|
|
Packit |
9c2278 |
if getattr(args, param, None) is None:
|
|
Packit |
9c2278 |
raise SystemExit('%s: error: --%s argument is required' % (__file__, param))
|
|
Packit |
9c2278 |
|
|
Packit |
9c2278 |
def warn_ignored_args(args, params):
|
|
Packit |
9c2278 |
for param in params:
|
|
Packit |
9c2278 |
if getattr(args, param, None) is not None:
|
|
Packit |
9c2278 |
print('%s: warning: --%s argument is ignored' % (__file__, param))
|
|
Packit |
9c2278 |
|
|
Packit |
9c2278 |
def main(argv):
|
|
Packit |
9c2278 |
|
|
Packit |
9c2278 |
parser = argparse.ArgumentParser(description='Process strings in a file.')
|
|
Packit |
9c2278 |
parser.add_argument('-a',
|
|
Packit |
9c2278 |
'--action',
|
|
Packit |
9c2278 |
help='Action to carry out. Can be one of:\n'
|
|
Packit |
9c2278 |
'remove-prefix\n'
|
|
Packit |
9c2278 |
'replace-var\n'
|
|
Packit |
9c2278 |
'replace-str\n'
|
|
Packit |
9c2278 |
'remove-str',
|
|
Packit |
9c2278 |
choices=valid_actions)
|
|
Packit |
9c2278 |
parser.add_argument('-i', '--input', help='Input file')
|
|
Packit |
9c2278 |
parser.add_argument('-o', '--output', help='Output file')
|
|
Packit |
9c2278 |
parser.add_argument('--instring', help='String to replace or remove')
|
|
Packit |
9c2278 |
parser.add_argument('--var', help='Autotools variable name to replace')
|
|
Packit |
9c2278 |
parser.add_argument('--outstring',
|
|
Packit |
9c2278 |
help='New String to replace specified string or variable')
|
|
Packit |
9c2278 |
parser.add_argument('--removeprefix', help='Prefix of string to remove')
|
|
Packit |
9c2278 |
|
|
Packit |
9c2278 |
args = parser.parse_args()
|
|
Packit |
9c2278 |
|
|
Packit |
9c2278 |
input_string = ''
|
|
Packit |
9c2278 |
output_string = ''
|
|
Packit |
9c2278 |
|
|
Packit |
9c2278 |
# We must have action, input, output for all operations
|
|
Packit |
9c2278 |
check_required_args(args, ['action','input','output'])
|
|
Packit |
9c2278 |
|
|
Packit |
9c2278 |
# Build the arguments by the operation that is to be done,
|
|
Packit |
9c2278 |
# to be fed into replace()
|
|
Packit |
9c2278 |
|
|
Packit |
9c2278 |
# Get rid of prefixes from a string
|
|
Packit |
9c2278 |
if args.action == 'remove-prefix':
|
|
Packit |
9c2278 |
check_required_args(args, ['instring','removeprefix'])
|
|
Packit |
9c2278 |
warn_ignored_args(args, ['outstring','var'])
|
|
Packit |
9c2278 |
input_string = args.removeprefix + args.instring
|
|
Packit |
9c2278 |
output_string = args.instring
|
|
Packit |
9c2278 |
|
|
Packit |
9c2278 |
# Replace an m4-style variable (those surrounded by @...@)
|
|
Packit |
9c2278 |
if args.action == 'replace-var':
|
|
Packit |
9c2278 |
check_required_args(args, ['var','outstring'])
|
|
Packit |
9c2278 |
warn_ignored_args(args, ['instring','removeprefix'])
|
|
Packit |
9c2278 |
input_string = '@' + args.var + '@'
|
|
Packit |
9c2278 |
output_string = args.outstring
|
|
Packit |
9c2278 |
|
|
Packit |
9c2278 |
# Replace a string
|
|
Packit |
9c2278 |
if args.action == 'replace-str':
|
|
Packit |
9c2278 |
check_required_args(args, ['instring','outstring'])
|
|
Packit |
9c2278 |
warn_ignored_args(args, ['var','removeprefix'])
|
|
Packit |
9c2278 |
input_string = args.instring
|
|
Packit |
9c2278 |
output_string = args.outstring
|
|
Packit |
9c2278 |
|
|
Packit |
9c2278 |
# Remove a string
|
|
Packit |
9c2278 |
if args.action == 'remove-str':
|
|
Packit |
9c2278 |
check_required_args(args, ['instring'])
|
|
Packit |
9c2278 |
warn_ignored_args(args, ['var','outstring','removeprefix'])
|
|
Packit |
9c2278 |
input_string = args.instring
|
|
Packit |
9c2278 |
output_string = ''
|
|
Packit |
9c2278 |
|
|
Packit |
9c2278 |
replace(args.input, args.output, input_string, output_string)
|
|
Packit |
9c2278 |
|
|
Packit |
9c2278 |
if __name__ == '__main__':
|
|
Packit |
9c2278 |
sys.exit(main(sys.argv))
|