grep

grep

보통

소개

동네 도서관에서 오래된 책들을 정리하는 일을 맡게 됐어요. 도서관을 찾는 학생들은 학기말 논문에 인용할, 어렴풋이 기억나는 구절을 찾느라 자주 헤매곤 하죠. 책을 한 권씩 처음부터 끝까지 직접 읽는 대신, 그런 부분 인용구를 찾아 훑어볼 작은 도구를 만들기로 해요.

지침

검색 문자열과 일치하는 줄을 파일에서 찾아, 일치하는 모든 줄을 반환해요.

Unix grep 명령은 정규 표현식과 일치하는 줄을 파일에서 검색해요. 이번 과제는 고정 문자열 검색을 지원하는 단순화한 grep 명령을 구현하는 거예요.

grep 명령은 세 가지 인자를 받아요:

  1. 검색할 문자열.
  2. 명령의 동작을 바꾸는 0개 이상의 플래그.
  3. 검색할 파일 하나 이상.

그런 다음 지정된 파일의 내용을 (지정된 순서대로) 읽고, 검색 문자열을 포함하는 줄을 찾아, 마지막으로 찾은 순서대로 그 줄들을 반환해요. 여러 파일을 검색할 때는 일치하는 각 줄 앞에 파일 이름과 콜론(':')을 붙여요.

플래그

grep 명령은 다음 플래그를 지원해요:

  • -n 출력의 각 줄 앞에 줄 번호와 콜론(':')을 붙여요. 번호는 파일 이름이 있으면 파일 이름 뒤에 와요.
  • -l 일치하는 줄이 하나 이상 있는 파일의 이름만 출력해요.
  • -i 대소문자를 구분하지 않고 비교해서 일치 여부를 판단해요.
  • -v 동작을 반대로 뒤집어요. 일치하지 않는 모든 줄을 모아요.
  • -x 검색 문자열이 줄 전체와 일치하는 줄만 검색해요.

Node 프로세스

다른 연습 문제와 달리, grep.js는 테스트 파일 grep.spec.js 안에서 불러오지 않아요. 대신, 마치 실행 파일인 것처럼 사용돼요. 이를 위해 grep.js 파일에는 셔뱅과, 이것이 무엇을 하는지 설명하는 주석이 설정되어 있어요.

#!/usr/bin/env node

// The above line is a shebang. On Unix-like operating systems, or environments,
// this will allow the script to be run by node, and thus turn this JavaScript
// file into an executable. In other words, to execute this file, you may run
// the following from your terminal:
//
// ./grep.js args
//
// If you do not have a Unix-like operating system or environment, for example
// Windows without WSL, you can use the following inside a window terminal,
// such as cmd.exe:
//
// node grep.js args
//
// Read more about shebangs here: https://en.wikipedia.org/wiki/Shebang_(Unix)

테스트는 새로운 node _프로세스_를 시작해서 grep.js를 실행해요.

인자 읽기

_프로세스_가 시작될 때 넘겨받은 인자를 가져오려면 process.argv를 사용해요.

파일 읽기

readLines 함수가 제공돼요. 사용하기 위해 파일 경로를 변환할 필요는 없어요. readlines 함수는 현재 작업 디렉터리를 기준으로 경로를 _해석_하는데, grep.js 프로세스의 경우 이 디렉터리는 연습 문제 디렉터리로 설정돼 있어요.

출력 쓰기

출력을 쓰려면 다음을 사용해요.

  • console.log는 표준 출력 스트림에 쓰고,
  • console.error는 표준 오류 스트림에 써요.

테스트는 표준 오류 스트림에 아무것도 쓰이지 않으면 실행이 성공(resolved)한 것으로 보고, 표준 오류 스트림에 무언가 쓰이면 성공하지 못한(rejected) 것으로 봐요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요
JavaScript Exercism

grep 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 JavaScript 트랙을 개념 37개연습 문제 159개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.