AzLearn

تمرين إعادة البناء

بحث نصي سريع

ابحث عن نمط داخل ملفات متعددة مع إبراز مطابقات ANSI اختيارياً.

python ~20 دقيقة متوسط
أعد بناء الكود Rebuild

هذا هو الكود. اكتبه بنفسك.

الكود المرجعي
import argparse
import re
from pathlib import Path


def iter_files(root: Path, pattern: str) -> list[Path]:
    if root.is_file():
        return [root]
    return sorted(path for path in root.rglob(pattern) if path.is_file())


def highlight(text: str, regex: re.Pattern[str], enabled: bool) -> str:
    if not enabled:
        return text
    return regex.sub(lambda match: f"{match.group(0)}", text)


def search_file(path: Path, regex: re.Pattern[str], color: bool) -> None:
    try:
        lines = path.read_text(encoding="utf-8", errors="replace").splitlines()
    except OSError as error:
        print(f"Cannot read {path}: {error}")
        return
    for number, line in enumerate(lines, start=1):
        if regex.search(line):
            print(f"{path}:{number}: {highlight(line, regex, color)}")


def main() -> None:
    parser = argparse.ArgumentParser(description="Search text across files.")
    parser.add_argument("root", type=Path)
    parser.add_argument("keyword")
    parser.add_argument("--glob", default="*.txt")
    parser.add_argument("--ignore-case", action="store_true")
    parser.add_argument("--color", action="store_true")
    args = parser.parse_args()

    flags = re.IGNORECASE if args.ignore_case else 0
    regex = re.compile(re.escape(args.keyword), flags)
    for path in iter_files(args.root, args.glob):
        search_file(path, regex, args.color)


if __name__ == "__main__":
    main()
اكتب هنا