Ejercicio 9
This commit is contained in:
parent
c27cc4b41f
commit
fbadca49ac
|
@ -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)
|
Loading…
Reference in New Issue