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
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
greplê-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, porquesed ' 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
example(outest) seguido por qualquer caractere entãocom. Exemploecho 'exampleAcom' | sed '/example.com/d'