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.Implementa:
grep ( pattern flags files -- lines )pattern é a string de pesquisa, flags é um array de zero ou mais das strings de flags "-n", "-l", "-i", "-v" e "-x", e files é um array de um ou mais nomes de ficheiros. Devolve as linhas correspondentes (com os prefixos de nome de ficheiro e de número de linha que forem pedidos) como um array de strings.
Quando é dada a flag -l, devolve um array com os nomes dos ficheiros que contêm pelo menos uma correspondência.
Lê as linhas de um ficheiro com file-lines, passando uma codificação:
USING: io.encodings.utf8 io.files ;
"iliad.txt" utf8 file-lines
! => { "Achilles sing, O Goddess! Peleus' son;" ... }
Os três ficheiros de exemplo (iliad.txt, midsummer-night.txt e paradise-lost.txt) vêm com o exercício no diretório de trabalho, por isso basta lê-los pelo nome.
Inscreve-te no Exercism para aprenderes e dominares Factor com 47 conceitos163 exercícios, e mentoria humana real, tudo grátis.