Hai trovato lavoro in una biblioteca locale, dove aiuti a organizzare la collezione di libri antichi. Gli studenti che la frequentano sono spesso a caccia di citazioni ricordate a metà, da inserire nelle loro tesine. Invece di leggere a mano ogni libro da cima a fondo, decidi di costruire un piccolo strumento che li analizzi, cercando proprio queste citazioni parziali.
Cerca nei file le righe che corrispondono a una stringa di ricerca e restituisci tutte le righe corrispondenti.
Il comando Unix grep cerca nei file le righe che corrispondono a un'espressione regolare. Il tuo compito è implementare una versione semplificata del comando grep, che supporta la ricerca di stringhe fisse.
Il comando grep accetta tre argomenti:
Poi legge il contenuto dei file specificati (nell'ordine indicato), trova le righe che contengono la stringa di ricerca e infine restituisce quelle righe nell'ordine in cui sono state trovate. Quando cerca in più file, ogni riga corrispondente è preceduta dal nome del file e dai due punti (':').
Il comando grep supporta i seguenti flag:
-n Anteponi il numero di riga e i due punti (':') a ogni riga dell'output, mettendo il numero dopo il nome del file (se presente).-l Restituisci solo i nomi dei file che contengono almeno una riga corrispondente.-i Confronta ignorando la differenza tra maiuscole e minuscole.-v Inverti il programma: raccogli tutte le righe che non corrispondono.-x Cerca solo le righe in cui la stringa di ricerca corrisponde all'intera riga.Powershell supporta i parametri switch per le funzioni, che si comportano in modo simile ai flag della riga di comando.
Per rispettare la consuetudine di Powershell di dare nomi dettagliati e verbosi ai cmdlet e alle loro proprietà, anche i flag usati in questo esercizio sono stati rinominati per riflettere il linguaggio.
Line (-n): antepone il numero di riga e i due punti (':') a ogni riga dell'output, inserendo il numero dopo il nome del file (se presente).File (-l): mostra in output solo i nomi dei file che contengono almeno una riga corrispondente.Insensitive (-i): cerca usando un confronto che non distingue maiuscole e minuscole.Invert (-v): inverte il programma, raccogliendo tutte le righe che non corrispondono.Whole (-x): cerca solo le righe in cui la stringa di ricerca corrisponde all'intera riga.Concentrati soprattutto sull'implementare la funzione grep, senza preoccuparti di ottenere correttamente il percorso dei file.
Questo esercizio fornirà 3 file di testo richiesti: iliad.txt, midsummer-night.txt e paradise-lost.txt nella suite di test; puoi semplicemente accedere al loro contenuto con Get-Content usando la stringa del nome invece del solito percorso di file.
Powershell ha effettivamente un cmdlet simile a grep chiamato Select-String, e se ti interessa puoi leggere di più qui.
In questo esercizio non devi usare Select-String in nessun momento.
Iscriviti a Exercism per imparare e padroneggiare PowerShell con 136 esercizi e il mentoring di persone reali, tutto gratis.