Arranjaste um emprego numa biblioteca local para ajudar a organizar a coleção de livros antigos. Os estudantes que a frequentam andam muitas vezes à procura de citações vagamente recordadas para citar nos seus trabalhos académicos. Em vez de leres manualmente todos os livros de fio a pavio, decides construir uma pequena ferramenta para os percorrer à procura dessas citações parciais.
Procura em ficheiros as linhas que correspondem a uma string de pesquisa e devolve todas as linhas correspondentes.
O comando grep do Unix procura em ficheiros as linhas que correspondem a uma expressão regular.
A tua tarefa é implementar um comando grep simplificado, que suporta a procura de strings fixas.
O comando grep recebe três argumentos:
De seguida, lê o conteúdo dos ficheiros indicados (pela ordem indicada), encontra as linhas que contêm a string de pesquisa e, por fim, devolve essas linhas pela ordem em que foram encontradas.
Ao procurar em vários ficheiros, cada linha correspondente é precedida pelo nome do ficheiro e por dois pontos (':').
O comando grep suporta as seguintes opções:
-n Acrescenta no início de cada linha da saída o número da linha e dois pontos (':'), colocando o número depois do nome do ficheiro (se existir).-l Mostra apenas os nomes dos ficheiros que contêm pelo menos uma linha correspondente.-i Compara sem distinguir maiúsculas de minúsculas.-v Inverte o programa, ou seja, reúne todas as linhas que não correspondem.-x Procura apenas as linhas em que a string de pesquisa corresponde à linha inteira.Ao contrário de outros exercícios, o grep.js não é importado dentro do ficheiro de testes grep.spec.js. Em vez disso, é usado como se fosse um executável. Para isso, o ficheiro grep.js foi preparado com um shebang e um comentário que explica o que isto faz:
#!/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)
Os testes iniciam um novo processo node que executa o grep.js.
Para obteres os argumentos com que o processo foi iniciado, usa process.argv.
A função readLines já está disponível. Não precisas de transformar o caminho do ficheiro para a usares. A função readlines vai resolver o caminho a partir do diretório de trabalho atual, que, no caso dos processos do grep.js, aponta para o diretório do exercício.
Para escreveres a saída, usa
console.log para escrever no fluxo de saída padrão,console.error para escrever no fluxo de erro padrão.Os testes consideram a execução bem-sucedida (resolvida) se nada for escrito no fluxo de erro padrão, e malsucedida (rejeitada) se algo for escrito nesse fluxo.
Inscreve-te no Exercism para aprenderes e dominares JavaScript com 37 conceitos159 exercícios, e mentoria humana real, tudo grátis.