remover linhas que contenham um texto específico em um arquivo

Eu tenho um arquivo com uma lista de emails e cada linha contém um email. Quero remover as linhas que contêm a string example.com ou test.com.

Tentei isso:

sed -i "s/example\.com//ig" file.txt 

Mas removerá apenas a string example.com, como posso remover a linha inteira?

Resposta

Com GNU sed:

sed "/example\.com/d;/test\.com/d" -i file.txt 

irá remover as linhas com example.com e test.com.

De man sed:

d Delete pattern space. Start next cycle. 

Comentários

  • Isso também excluirá a linha que contém example (ou test) seguido por qualquer caractere então com. Exemplo echo 'exampleAcom' | sed '/example.com/d'
  • Gah, bobo que sou distraidamente não escapando do ponto. Obrigado por notar!

Resposta

POSIXly, você pode usar grep:

grep -Eiv "(example|test)\.com" <in >out 

Comentários

  • Tenha cuidado para não usar o mesmo arquivo para entrada e saída , ou será truncado antes de grep lê-lo.

Resposta

Sua regex corresponde apenas a example.com e sed substitui apenas example.com s por vazio fragmento. Seu regex deve corresponder a qualquer linha que contenha example.com ou test.com

sed -i "s@.*\(test\|example\)\.com.*@@i" file.txt 

Comentários

  • Seu a resposta não exclui linhas correspondentes; só os deixa em branco. – Também não lida com texto que não diferencia maiúsculas de minúsculas (conforme o exemplo do OP ' s). -. O g é redundante / sem sentido, porque sed ‍ ' s regex é ganancioso e, portanto, o .* à esquerda e à direita fará com que a primeira ocorrência de uma correspondência de texto corresponda a toda a linha. ‍
  • Obrigado pelo feedback. Eu não ' prestei atenção à distinção entre maiúsculas e minúsculas. g é meu hábito, você tem razão, não é necessário. Também pensei que a linha cega era o que a OP queria. Agora está tudo claro. Obrigado

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *