Has aceptado un trabajo en una biblioteca local para ayudar a organizar su colección de libros antiguos. Los estudiantes que acuden a ella suelen andar buscando citas que recuerdan a medias para incluirlas en sus trabajos de fin de curso. En lugar de leer a mano cada libro de principio a fin, decides crear una pequeña herramienta que los examine en busca de esas citas parciales.
Busca en los ficheros las líneas que coincidan con un string de búsqueda y devuelve todas las líneas coincidentes.
El comando grep de Unix busca en los ficheros las líneas que coincidan con una expresión regular.
Tu tarea es implementar una versión simplificada del comando grep, que permite buscar strings fijos.
El comando grep acepta tres argumentos:
A continuación, lee el contenido de los ficheros indicados (en el orden indicado), encuentra las líneas que contienen el string de búsqueda y, por último, devuelve esas líneas en el orden en que se encontraron. Cuando se busca en varios ficheros, cada línea coincidente va precedida por el nombre del fichero y dos puntos (':').
El comando grep admite las siguientes opciones:
-n Antepone el número de línea y dos puntos (':') a cada línea de la salida, colocando el número después del nombre del fichero (si lo hay).-l Muestra solo los nombres de los ficheros que contienen al menos una línea coincidente.-i Compara sin distinguir entre mayúsculas y minúsculas.-v Invierte el programa: recoge todas las líneas que no coincidan.-x Busca solo las líneas en las que el string de búsqueda coincide con la línea completa.Este ejercicio presenta el crate anyhow, que facilita el manejo de tipos de error arbitrarios.
Su intención es garantizar que, cuando escribes una aplicación, no tengas que preocuparte por los
errores concretos que devuelve la función a la que llamas, sino simplemente hacer lo correcto al propagarlos.
Nota: en realidad no es muy buena práctica usar anyhow al escribir una biblioteca, como hacemos aquí; es más
explícito y más útil escribir tu propia enumeración Error cuando escribes una biblioteca (posiblemente con la ayuda de macros
auxiliares como las que proporciona el crate thiserror). Sin embargo, aquí lo hacemos
de forma intencionada y explícita para demostrar el uso de este crate.
Para saber más sobre este crate, consulta su documentación.
Aunque este ejercicio te pide implementar solo las funciones más básicas de grep,
en realidad existe un proyecto para reimplementar grep por completo en Rust: ripgrep.
Si te ha gustado la idea de reescribir los programas de utilidades básicos en Rust, echa un vistazo a los siguientes proyectos:
Regístrate en Exercism para aprender y dominar Rust con 99 ejercicios y mentoría humana real, todo gratis.