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
greppuisse 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
gest 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.
gcest 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'