From fbadca49ac4acc73700f532b9d2e5c0ce41da0e7 Mon Sep 17 00:00:00 2001 From: perro Date: Fri, 24 Feb 2023 11:30:00 -0800 Subject: [PATCH] Ejercicio 9 --- exercises/ex09/ex09.py | 56 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 exercises/ex09/ex09.py diff --git a/exercises/ex09/ex09.py b/exercises/ex09/ex09.py new file mode 100644 index 0000000..0f43c01 --- /dev/null +++ b/exercises/ex09/ex09.py @@ -0,0 +1,56 @@ +# Exercise 9 +# 1. sed command + +import re +import sys +import argparse +from pathlib import Path + + +def check(expression, exp): + error = False + if ( + expression[-1] not in "/g" + or exp[0] not in "s" + or len(exp) not in range(3, 5) + or (expression[-1] in "g" and len(exp) != 4) + or (expression[-1] in "/" and len(exp) == 4) + ): + error = True + if error: + print(f"sed: expresión «{expression}» inválida") + sys.exit(1) + + +def parse(expression): + count = 0 + exp = list(filter(None, expression.split("/"))) + check(expression, exp) + if len(exp) == 3: + count = 1 + return { + "rgx": re.compile(exp[1]), + "rep": exp[2], + "n": count, + } + + +parser = argparse.ArgumentParser() +parser.add_argument("stream", default=sys.stdin, nargs="*") +parser.add_argument( + "-e", "--expression", required=True, type=str, action="append" +) +args = parser.parse_args() +res = "" + +for exp in args.expression: + exp = parse(exp) + for stream in args.stream: + if isinstance(args.stream, list): + stream = Path(stream).read_text() + else: + stream = stream.strip() + if res == "": + res = stream + res = re.sub(exp["rgx"], exp["rep"], res, count=exp["n"]) +print(res)