Quel est le plus efficace de la casse grep utilisation?
Mon objectif est de faire correspondre les adresses e-mail qui appartiennent à la Yahoo! la famille de domaines. Dans les systèmes *nix (je vais utiliser Ubuntu), quels sont les avantages et les inconvénients de chacune de ces méthodes pour la mise en correspondance du modèle?
Et si il y a une solution plus élégante que je n'ai pas été capable d'imaginer, s'il vous plaît partager.
Ici, ils sont:
- Utilisation
grep
avec l'option-i
:
grep -Ei "@(yahoo|(y|rocket)mail|geocities)\.com"
- Traduire les caractères de toutes les majuscules ou en minuscules puis
grep
:
tr [:upper:] [:lower:] < /path/to/file.txt | grep -E "@(yahoo|(y|rocket)mail|geocities)\.com"
- Comprennent un jeu de caractères pour chaque caractère dans le modèle (ci-dessous serait bien sûr de ne pas correspondre à quelque chose comme "@rOcketmail.com" mais vous avez l'idée de ce qu'elle deviendrait si j'ai vérifié chaque caractère de cas):
grep -E "@([yY]ahoo|([yY]|[rR]ocket)[mM]ail|[gG]eo[cC]ities)\.[cC][oO][mM]" /path/to/file.txt
- Ce ne serait pas difficile à tester. Avez-vous essayé?
- Avez-vous essayé de benchmarking? Je soupçonne que votre premier échantillon sera la plus rapide. Je pense que ce problème est plus susceptible d'être étranglé par un fichier I/O que la vitesse de traitement... car il est linéaire en la taille de l'entrée. Méfiez-vous de micro-optimisation.
- Une chose que vous voudrez peut-être garder à l'esprit est que la capture des groupes peut être coûteux. Si vous n'avez pas besoin de retourner les groupes de valeurs, pensez à utiliser
(?:)
à la place.
Vous devez vous connecter pour publier un commentaire.
grep -i
s'est avéré être beaucoup plus lent que la traduction d'réduit avant grepping, donc j'ai fini par utiliser une variante du n ° 2.Merci @mike-w pour me rappeler que d'un simple test va un long chemin.