a modo de ejemplo, tengo un gran archivo de texto con muchas direcciones de correo electrónico, usando bash necesito buscar / verificar que exista un correo electrónico (o no). ¿Se deben usar (solo) los "anclajes"?
grep '^[email protected]' text_file
o hay mejores maneras? Necesito crear un script bash y me gustaría estar a salvo.
grep -q '^user1@example\.com\>'
, con un ancla de línea al comienzo y un ancla de fin de palabra al final.Respuestas:
Vea las opciones
-F
(cadena fija, en lugar de expresión regular) y-x
(exacto: coincida con la línea completa).sería el equivalente de:
(recuerde que
.
es un operador de expresión regular que coincide con cualquier carácter).Use la
-q
opción si solo desea verificar si existe esa línea:Si la línea a buscar y el nombre del archivo son variables:
O
No quieres:
grep -Fxq "$email" "$file"ya que ello causar problemas si
$email
o$file
empezar con-
.Si el archivo está ordenado (en su localidad actual, preferiblemente
C
), puede acelerar las cosas usando encomm
lugar degrep
:La ventaja será más evidente cuando tenga varias direcciones de correo electrónico para verificar (por ejemplo, en otro archivo ordenado):
sería más rápido que:
fuente
grep -Fxq -- "$email" "$file"
también funciona.<
redirector? ¿hay alguna ventaja?-
. inclusogrep -- "$email" "$file"
sería un problema para un archivo llamado-
(quegrep
trata especialmente como stdin de significado )Para ser lo más eficiente posible, desea detenerse después de encontrar la primera coincidencia. Si tiene GNU
grep
, puede hacer esto:Si no lo hace, puede usar Perl:
fuente
-m
es específico de GNU. Utilice POSIX-q
si desea verificar de manera eficiente que exista dicha línea.Hay muchos cheques por correo electrónico allí. Uno de esos es:
Para elaborar mi respuesta.
Está utilizando el
^
ancla que indica el inicio de la cadena. Esto no coincidirá si una dirección de correo electrónico está en algún lugar entre una cadena larga.fuente
su
grep
comando coincidirá con todo lo que comienza^[email protected]
, incluida la dirección de correo electrónico en sí, pero también[email protected]
. dado que.
es un carácter especial en expresiones regulares que coincide con cualquier tecla, debe escapar como\.
suponiendo que su archivo de texto contenga una dirección por línea, use:
el final
$
se asegurará de que la línea termine después de la dirección de correo electrónico. También estoy usando comillas dobles"
, ya que estas permiten usar variables (a diferencia de las comillas simples'
)fuente
user1@example-com
.-Fx
.-Fx
, sino que los de Stephane respuesta :-)Teniendo en cuenta la coincidencia de cadena literal / exacta general:
o,
fuente