a título de exemplo, eu tenho um grande arquivo de texto com muitos endereços de email, usando o bash, preciso pesquisar / verificar se existe um email (ou não). Deve usar (apenas) as "âncoras"?
grep '^[email protected]' text_file
ou há maneiras melhores? Preciso criar um script bash e gostaria de estar seguro.
grep -q '^user1@example\.com\>'
- com uma âncora de linha no início e uma âncora de fim de palavra no final.Respostas:
Veja as opções
-F
(sequência fixa, em oposição à expressão regular) e-x
(exata: coincide com a linha inteira).seria o equivalente a:
(lembre-se de que
.
é um operador de expressão regular que corresponde a qualquer caractere).Use a
-q
opção se você quiser apenas verificar se existe essa linha:Se a linha a pesquisar e o nome do arquivo forem variáveis:
Ou
Você não quer:
grep -Fxq "$email" "$file"pois isso causaria problemas se
$email
ou$file
iniciado-
.Se o arquivo estiver classificado (no seu local atual, preferencialmente
C
), você poderá acelerar as coisas usando, emcomm
vez degrep
:A vantagem se tornará mais óbvia quando você tiver vários endereços de email para verificar (por exemplo, em outro arquivo classificado):
seria mais rápido que:
fonte
grep -Fxq -- "$email" "$file"
também funciona.<
redirecionador? existem vantagens?-
. aindagrep -- "$email" "$file"
seria um problema para um arquivo chamado-
(quegrep
trata especialmente como significado stdin )Para ser o mais eficiente possível, você deseja parar depois que a primeira correspondência for encontrada. Se você possui o GNU
grep
, pode fazer o seguinte:Caso contrário, você pode usar Perl:
fonte
-m
é específico do GNU. Use o POSIX-q
se quiser verificar eficientemente se existe uma linha assim.Existem muitas verificações por email lá. Um deles é:
Para elaborar minha resposta.
Você está usando a
^
âncora que indica o início da string. Isso não corresponderá se um endereço de email estiver em algum lugar entre uma string longa.fonte
seu
grep
comando corresponderá a tudo o que começar^[email protected]
, incluindo o próprio endereço de email, mas também[email protected]
. como.
é um caractere especial em expressões regulares que corresponde a qualquer tecla, você deve evitá-lo como\.
assumindo que seu arquivo de texto contenha um endereço por linha, use:
o final
$
garantirá que a linha termine após o endereço de email. Também estou usando aspas duplas"
, pois elas permitem o uso de variáveis (ao contrário das aspas simples'
)fonte
user1@example-com
.-Fx
.-Fx
, mas isso é de Stephane resposta :-)Considerando correspondência literal / exata geral de seqüência de caracteres:
ou,
fonte