From 65dd8bf97da6745d9e76109f2b4fd43cd9420fed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20BERTHO?= Date: Sat, 14 Oct 2017 11:46:09 +0200 Subject: [PATCH] Add input file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: RĂ©mi BERTHO --- SSnR.py | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 62 insertions(+), 7 deletions(-) diff --git a/SSnR.py b/SSnR.py index 2350b28..d45e6b9 100644 --- a/SSnR.py +++ b/SSnR.py @@ -32,11 +32,29 @@ def main(): """ parser = argparse.ArgumentParser(description='Search and replace tool', prog='SSnR') parser.add_argument('-e', '--regex', help='Regex', required=True) - parser.add_argument('-s', '--string', help='String', required=True) + parser.add_argument('-s', '--string', help='String', required=False) + parser.add_argument('-i', '--input', help='Input file', required=False, type=open) parser.add_argument('-r', '--replace', help='Replace', required=False) parser.add_argument('-m', '--print_nb_match', help='Print the number of match in replace', required=False, action='store_true') - args = vars(parser.parse_args()) + parser.add_argument('-c', '--ignore_case', help='Ignore the case', + required=False, action='store_true') + try: + args = vars(parser.parse_args()) + except FileNotFoundError as exception: + print("Error: file not found: " + str(exception)) + return -1 + + # Get input + if args["input"] is not None: + string = args["input"].read() + is_file = True + elif args["string"] is not None: + string = args["string"] + is_file = False + else: + print("Error: You need an input string or file") + return -1 # Compile regex try: @@ -48,10 +66,11 @@ def main(): print("Error when compiling regex: " + exception.msg) return -1 + # Search or replace if args["replace"] is not None: - replace(ex, args["string"], args["replace"], args["print_nb_match"]) + replace(ex, string, args["replace"], args["print_nb_match"]) else: - search(ex, args["string"]) + search(ex, string, is_file) return 0 def compile_regex(ex): @@ -60,23 +79,32 @@ def compile_regex(ex): :param ex: Regular expression """ regex_compile = regex.compile(ex, regex.MULTILINE) + if regex_compile is None: raise SyntaxError('Error in the regex') else: return regex_compile -def search(ex, string): +def search(ex, string, is_file): """ Search in a string :param ex: Regular expression :param string: A string """ + if is_file: + new_lines = get_line_pos(string) + ite = ex.finditer(string) nb_match = 0 for match in ite: nb_match += 1 - print(" - Found \"" + match.group(0) + "\" at [" + str(match.start(0)) + - ":" + str(match.end(0)) + "]") + if is_file: + num_line, begin_pos, end_pos = find_line(match.start(0), match.end(0), new_lines) + print(" - Found \"" + match.group(0) + "\" at line " + str(num_line) + " [" + str(begin_pos) + + ":" + str(end_pos) + "]") + else: + print(" - Found \"" + match.group(0) + "\" at [" + str(match.start(0) + 1) + + ":" + str(match.end(0)) + "]") print("Number of match: " + str(nb_match)) @@ -92,5 +120,32 @@ def replace(ex, string, replace_string, print_nb): if print_nb: print("Number of match: " + str(res[1])) +def get_line_pos(string): + """ + Get new lines postion in a string + :param string: a string + """ + ex = regex.compile("^", regex.MULTILINE) + ite = ex.finditer(string) + new_lines = [] + for match in ite: + new_lines.append(match.start(0)) + return new_lines + +def find_line(begin_pos, end_pos, new_lines): + """ + Find the line number and the position in the line + :param pos: the position to find the line + :param new_lines: then new lines + """ + num_line = 0 + old_pos_line = 0 + for pos_line in new_lines: + if pos_line > begin_pos: + return num_line, begin_pos - old_pos_line + 1, end_pos - old_pos_line + num_line += 1 + old_pos_line = pos_line + + if __name__ == '__main__': sys.exit(main())