2014-04-07 31 views
32

Moim celem jest dopasowanie adresów e-mail należących do Yahoo! rodzina domen. W systemach * nix (będę używać Ubuntu), jakie są zalety i wady jednej z tych metod do dopasowania wzorca?Jaka jest najbardziej efektywna niewrażliwa na wielkość liter grep?

A jeśli istnieje inne, bardziej eleganckie rozwiązanie, którego nie potrafiłem sobie wyobrazić, podziel się.

Oto one:

  • Zastosowanie grep z opcją -i:

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

  • Przekłada znaki wszystkim wielkimi literami lub małymi literami następnie grep:

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

  • zawierać zestaw znaków dla każdego znaku w strukturze (poniżej nie byłoby oczywiście dopasować coś jak „@ rOcketmail.com”, ale masz pomysł, co stałoby się, gdybym sprawdził każdy znaków dla sprawy):

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

+5

To nie będzie trudne do przetestowania. Próbowałeś tego? –

+1

Czy próbowałeś testów porównawczych? Podejrzewam, że twoja pierwsza próba będzie najszybsza. Spodziewam się, że ten problem jest bardziej prawdopodobny, że jest dławiony przez plik I/O niż szybkość przetwarzania ... ponieważ jest liniowy w rozmiarze wejścia. Uważaj na [mikrooptymalizację] (http://blog.codinghorror.com/the-sad-tragedy-of-micro-optymizacja-theater/). – Floris

+0

Jedną z rzeczy, o których warto pamiętać, jest to, że przechwytywanie grup może być kosztowne. Jeśli nie potrzebujesz zwracać zgrupowanych wartości, rozważ zamiast tego użycie '(? :)'. – CAustin

Odpowiedz

34

grep -i okazała się znacznie wolniej niż przekłada się obniża przed grepping, więc skończyło się stosując odmianę # 2.

Dzięki @ mike-w za przypomnienie, że prosty test idzie długą drogę.

+4

Dziękuję za podzielenie się wynikami testów z nami wszystkimi! – Dan