Jai un fichier avec une liste de-mails et chaque ligne contient un e-mail. Je souhaite supprimer les lignes contenant la chaîne example.com
ou test.com
.
Jai essayé ceci:
sed -i "s/example\.com//ig" file.txt
Mais il supprimera uniquement la chaîne example.com
, comment puis-je supprimer la ligne entière?
Réponse
Avec GNU sed:
sed "/example\.com/d;/test\.com/d" -i file.txt
supprimera les lignes avec example.com
et test.com
.
De man sed
:
d Delete pattern space. Start next cycle.
Commentaires
Réponse
POSIXly, vous pouvez utiliser grep
:
grep -Eiv "(example|test)\.com" <in >out
Commentaires
- Veillez à ne pas utiliser le même fichier pour lentrée et la sortie , ou il sera tronqué avant que
grep
puisse le lire.
Réponse
Votre expression régulière correspond uniquement à example.com
et sed
remplace uniquement les example.com
par des valeurs vides chaîne de caractères. Votre expression régulière doit correspondre à nimporte quelle ligne contenant example.com ou test.com
sed -i "s@.*\(test\|example\)\.com.*@@i" file.txt
Commentaires
- Votre la réponse ne supprime pas les lignes correspondantes; cela ne fait que les rendre vides. – Il ne gère pas non plus le texte insensible à la casse (comme dans lexemple de OP '). -. Le
g
est redondant / sans signification, carsed
' s regex est gourmand et donc les.*
de début et de fin feront correspondre la première occurrence dune correspondance de texte à toute la ligne. - Merci pour vos commentaires. Je nai ' pas prêté attention à la sensibilité à la casse.
g
cest mon habitude, vous avez raison, ce nest pas nécessaire. Jai aussi pensé que cétait ce que voulait OP. Maintenant, tout est clair. Merci
example
(outest
) suivi de nimporte quel caractère puiscom
. Exempleecho 'exampleAcom' | sed '/example.com/d'