تمرين إعادة البناء
بحث نصي سريع
ابحث عن نمط داخل ملفات متعددة مع إبراز مطابقات 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"[93m{match.group(0)}[0m", 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()اكتب هنا