2014-04-07 17 views
32

Il mio obiettivo è abbinare gli indirizzi email che appartengono a Yahoo! famiglia di domini. Nei sistemi * nix (userò Ubuntu), quali sono i vantaggi e gli svantaggi di uno qualsiasi di questi metodi per la corrispondenza del modello?Qual è l'utilizzo di grep senza distinzione tra maiuscole e minuscole?

E se c'è un'altra soluzione più elegante che non sono stato in grado di immaginare, per favore condividi.

Eccoli:

  • Usa grep con l'opzione -i:

grep -Ei "@(yahoo|(y|rocket)mail|geocities)\.com"

  • converte i caratteri in lettere maiuscole o minuscole poi grep:

tr [:upper:] [:lower:] < /path/to/file.txt | grep -E "@(yahoo|(y|rocket)mail|geocities)\.com"

  • Includere un set di caratteri per ogni carattere nel modello (il seguito sarebbe ovviamente non corrisponde qualcosa come "@ rOcketmail.com", ma si ottiene l'idea di quello che sarebbe diventato se ho controllato ogni carattere per caso):

grep -E "@([yY]ahoo|([yY]|[rR]ocket)[mM]ail|[gG]eo[cC]ities)\.[cC][oO][mM]" /path/to/file.txt

+5

Questo non sarebbe difficile da testare. L'hai provato? –

+1

Hai provato il benchmarking? Sospetto che il tuo primo campione sarà il più veloce. Mi aspetto che questo problema sia più probabile che venga limitato dal file I/O rispetto alla velocità di elaborazione ... poiché è lineare nella dimensione dell'input. Attenzione [micro-ottimizzazione] (http://blog.codinghorror.com/the-sad-tragedy-of-micro-optimization-theater/). – Floris

+0

Una cosa che dovresti tenere a mente è che catturare gruppi può essere costoso. Se non è necessario restituire i valori raggruppati, prendere in considerazione l'uso di '(? :)' invece. – CAustin

risposta

34

grep -i si è rivelata molto più lento rispetto a tradurre per abbassa prima di grep, così ho finito per usare una variante di # 2.

Grazie @ mike-w per avermi ricordato che un semplice test ha una lunga durata.

+4

E grazie per aver condiviso i risultati dei test con tutti noi! – Dan