From 1f84479a803dc3219d11c8082d60133b4531f53f Mon Sep 17 00:00:00 2001 From: perro Date: Fri, 3 Mar 2023 11:59:57 -0800 Subject: [PATCH] Ejercicio 11 --- exercises/ex09/sed | 34 ++++++++++------------------------ exercises/ex11/cut | 1 + exercises/ex11/sed | 1 + exercises/ex11/sort | 1 + exercises/ex11/uniq | 37 +++++++++++++++++++++++++++++++++++++ 5 files changed, 50 insertions(+), 24 deletions(-) create mode 120000 exercises/ex11/cut create mode 120000 exercises/ex11/sed create mode 120000 exercises/ex11/sort create mode 100755 exercises/ex11/uniq diff --git a/exercises/ex09/sed b/exercises/ex09/sed index 27c99c7..3ff8065 100755 --- a/exercises/ex09/sed +++ b/exercises/ex09/sed @@ -8,34 +8,20 @@ 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: +def parse(expression): + try: + match = re.fullmatch(r's/(.*)/(.*)/(g{0,1})', expression) + count = 0 if match.group(3) == "g" else 1 + return { + "rgx": re.compile(match.group(1)), + "rep": match.group(2), + "n": count + } + except Exception: 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( diff --git a/exercises/ex11/cut b/exercises/ex11/cut new file mode 120000 index 0000000..5bd2716 --- /dev/null +++ b/exercises/ex11/cut @@ -0,0 +1 @@ +../ex08/cut \ No newline at end of file diff --git a/exercises/ex11/sed b/exercises/ex11/sed new file mode 120000 index 0000000..5bca51d --- /dev/null +++ b/exercises/ex11/sed @@ -0,0 +1 @@ +../ex09/sed \ No newline at end of file diff --git a/exercises/ex11/sort b/exercises/ex11/sort new file mode 120000 index 0000000..d12f599 --- /dev/null +++ b/exercises/ex11/sort @@ -0,0 +1 @@ +../ex10/sort \ No newline at end of file diff --git a/exercises/ex11/uniq b/exercises/ex11/uniq new file mode 100755 index 0000000..d11b227 --- /dev/null +++ b/exercises/ex11/uniq @@ -0,0 +1,37 @@ +#!/usr/bin/env python +# Exercise 11 +# uniq command + +import sys +import argparse +from pathlib import Path + +parser = argparse.ArgumentParser() +parser.add_argument("stream", default=sys.stdin, nargs="*") +parser.add_argument("-i", "--ignore-case", action="store_true") +parser.add_argument("-c", "--count", action="store_true") +args = parser.parse_args() +lines = [] +counter = None + +for stream in args.stream: + if isinstance(args.stream, list): + for line in Path(stream).open().readlines(): + lines.append(line.rstrip()) + else: + lines.append(stream.strip()) + +if args.ignore_case: + lines = list(map(lambda l: l.lower(), lines)) + +if args.count: + counter = {} + for line in lines: + counter.setdefault(line, 0) + counter[line] += 1 + +lines = sorted(set(lines)) + +for line in lines: + msg = line if counter is None else f"{counter[line]} {line}" + print(msg)