Usando strings fixas em expressões regulares?

2

Estou escrevendo um script bash que aceita uma lista de arquivos CSV como argumentos e gera endereços de e-mail encontrados apenas no primeiro arquivo. Para fazer isso, para cada registro no primeiro arquivo CSV, eu procuro o campo de endereço de e-mail e leio seu conteúdo em uma variável shell. Então, eu uso grep -iE com a seguinte expressão regular para procurar o endereço de e-mail encontrado em todos os arquivos restantes, certificando-se de que não é uma subseqüência (por exemplo, [email protected] não é o mesmo que [email protected] ), e permite que seja no início ou no final de um registro:

"^(.*,)?($EMAIL_ADDRESS|\"$EMAIL_ADDRESS\")(,.*)?\$"

Um problema com essa abordagem é que os endereços de e-mail contêm pontos que têm um significado especial em expressões regulares. Minhas perguntas são:

  1. Como posso evitar esse problema de uma maneira elegante?
  2. Como posso evitar esse problema em um contexto mais geral? quando o valor para procurar não é um endereço de e-mail, mas algum texto livre e pode conter outros caracteres especiais também?
por SJU 14.04.2015 / 11:42

1 resposta

1

em regexp perl ( grep -P ... ) você pode usar \Q...\E para proteger meta chars

grep -P "(^|,)\Q$EMAIL\E(,|$)" file.csv

onde:

  • (^|,) = início do campo
  • (,|$) = fim do campo
por 14.04.2015 / 17:20