동네 도서관에서 오래된 책들을 정리하는 일을 맡게 됐어요. 도서관을 찾는 학생들은 학기말 논문에 인용할, 어렴풋이 기억나는 구절을 찾느라 자주 헤매곤 하죠. 책을 한 권씩 처음부터 끝까지 직접 읽는 대신, 그런 부분 인용구를 찾아 훑어볼 작은 도구를 만들기로 해요.
검색 문자열과 일치하는 줄을 파일에서 찾아, 일치하는 모든 줄을 반환해요.
Unix grep 명령은 정규 표현식과 일치하는 줄을 파일에서 검색해요.
이번 과제는 고정 문자열 검색을 지원하는 단순화한 grep 명령을 구현하는 거예요.
grep 명령은 세 가지 인자를 받아요:
그런 다음 지정된 파일의 내용을 (지정된 순서대로) 읽고, 검색 문자열을 포함하는 줄을 찾아, 마지막으로 찾은 순서대로 그 줄들을 반환해요. 여러 파일을 검색할 때는 일치하는 각 줄 앞에 파일 이름과 콜론(':')을 붙여요.
grep 명령은 다음 플래그를 지원해요:
-n 출력의 각 줄 앞에 줄 번호와 콜론(':')을 붙여요. 번호는 파일 이름이 있으면 파일 이름 뒤에 와요.-l 일치하는 줄이 하나 이상 있는 파일의 이름만 출력해요.-i 대소문자를 구분하지 않고 비교해서 일치 여부를 판단해요.-v 동작을 반대로 뒤집어요. 일치하지 않는 모든 줄을 모아요.-x 검색 문자열이 줄 전체와 일치하는 줄만 검색해요.이 연습 문제에서는 anyhow 크레이트를 소개해요. 이 크레이트를 사용하면 임의의 오류 타입을 쉽게 다룰 수 있어요.
anyhow의 목적은 애플리케이션을 작성할 때 호출한 함수가 어떤 특정 오류를 반환하는지 걱정할 필요 없이,
오류를 전파할 때 알맞은 처리를 하도록 하는 데 있어요.
참고: 여기서처럼 라이브러리를 작성할 때 anyhow를 사용하는 것은 사실 그다지 좋은 방식이 아니에요. 라이브러리를
작성할 때는 (thiserror 크레이트에서 제공하는 것과 같은 도우미
매크로의 도움을 받아) 직접 Error 열거형을 작성하는 것이 더 명확하고 유용해요. 하지만 여기서는 이 크레이트의
사용법을 보여 주기 위해 의도적이고 분명하게 anyhow를 사용하고 있어요.
이 크레이트에 대해 더 알아보려면 문서를 참고해 봐요.
이 연습 문제에서는 grep의 가장 기본적인 기능만 구현하도록 하지만,
실제로 Rust로 grep을 완전히 다시 구현한 프로젝트가 있어요. 바로 ripgrep이에요.
Rust로 기본 유틸리티 프로그램을 다시 작성하는 개념이 마음에 들었다면 다음 프로젝트들도 꼭 확인해 봐요: