à titre d'exemple, j'ai un gros fichier texte avec de nombreuses adresses email, en utilisant bash j'ai besoin de rechercher / vérifier qu'un email existe (ou pas). Doit-on utiliser (uniquement) les "ancres"?
grep '^[email protected]' text_file
ou il y a de meilleures façons? J'ai besoin de créer un script bash et j'aimerais être en sécurité.
grep -q '^user1@example\.com\>'
- avec une ancre de ligne au début et une ancre de fin de mot à la fin.Réponses:
Voir les options
-F
(chaîne fixe, par opposition à l'expression régulière) et-x
(exacte: correspondre à toute la ligne).serait l'équivalent de:
(rappelez-vous que
.
c'est un opérateur d'expression régulière qui correspond à n'importe quel caractère).Utilisez l'
-q
option si vous souhaitez uniquement vérifier s'il existe une telle ligne:Si la ligne à rechercher et le nom de fichier sont variables:
Ou
Tu ne veux pas:
grep -Fxq "$email" "$file"car cela causerait des problèmes si
$email
ou au$file
début-
.Si le fichier est trié (dans vos paramètres régionaux actuels, de préférence
C
), vous pouvez éventuellement accélérer les choses en utilisantcomm
au lieu degrep
:L'avantage deviendra plus évident lorsque vous aurez plusieurs adresses e-mail à vérifier (par exemple dans un autre fichier trié):
serait plus rapide que:
la source
grep -Fxq -- "$email" "$file"
fonctionne également.<
redirecteur? y a-t-il des avantages?-
. mêmegrep -- "$email" "$file"
serait un problème pour un fichier appelé-
(quigrep
traite spécialement comme signifiant stdin )Pour être aussi efficace que possible, vous voulez vous arrêter après avoir trouvé la première correspondance. Si vous avez GNU
grep
, vous pouvez le faire:Sinon, vous pouvez utiliser Perl:
la source
-m
est spécifique à GNU. Utilisez le POSIX-q
si vous souhaitez vérifier efficacement qu'il existe une telle ligne.Il y a beaucoup de vérifications par e-mail là-bas. L'un d'eux est:
Pour élaborer ma réponse.
Vous utilisez l'
^
ancre qui indique le début de la chaîne. Cela ne correspondra pas si une adresse e-mail se situe quelque part entre une longue chaîne.la source
votre
grep
commande correspondra à tout ce qui commence par^[email protected]
, y compris l'adresse e-mail elle-même, mais aussi[email protected]
. comme.
c'est un caractère spécial dans les expressions régulières qui correspond à n'importe quelle touche, vous devez l'échapper comme\.
en supposant que votre fichier texte contient une adresse par ligne, utilisez:
la fin
$
s'assurera que la ligne se termine après l'adresse e-mail."
j'utilise également des guillemets doubles , car ceux-ci permettent d'utiliser des variables (contrairement aux guillemets simples'
)la source
user1@example-com
.-Fx
.-Fx
mais c'est la réponse de stephane :-)Considérant la correspondance générale littérale / chaîne exacte:
ou,
la source