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
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, 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'