Ich habe eine Datei mit einer Liste von E-Mails und jede Zeile enthält eine E-Mail. Ich möchte Zeilen entfernen, die die Zeichenfolge example.com oder test.com enthalten.
Ich habe Folgendes versucht:
sed -i "s/example\.com//ig" file.txt
Es wird jedoch nur die Zeichenfolge example.com entfernt. Wie kann ich die gesamte Zeile entfernen?
Antwort
Mit GNU sed:
sed "/example\.com/d;/test\.com/d" -i file.txt
entfernt die Zeilen mit example.com und test.com.
Von man sed:
d Delete pattern space. Start next cycle.
Kommentare
- Dadurch wird auch die Zeile gelöscht, die
example(odertest) gefolgt von einem beliebigen Zeichen, danncom. Beispielecho 'exampleAcom' | sed '/example.com/d' - Gah, dumm mich abwesend, dem Punkt nicht zu entkommen. Vielen Dank für Ihre Nachricht!
Antwort
POSIXly, Sie können grep:
grep -Eiv "(example|test)\.com" <in >out
Kommentare
- Achten Sie darauf, nicht dieselbe Datei für die Eingabe und Ausgabe zu verwenden , oder es wird abgeschnitten, bevor
grepes lesen kann.
Antwort
Ihre Regex stimmt nur mit example.com überein, und sed ersetzt nur example.com s durch leer Zeichenfolge. Ihre Regex sollte mit jeder Zeile übereinstimmen, die example.com oder test.com enthält.
sed -i "s@.*\(test\|example\)\.com.*@@i" file.txt
Kommentare
- Ihre Antwort löscht keine übereinstimmenden Zeilen; es macht sie nur leer. – Es wird auch kein Text behandelt, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird (gemäß dem Beispiel von OP '). -. Die
gist redundant / bedeutungslos, daseddiv ' s Regex gierig und daher ist Das führende und nachfolgende.*bewirkt, dass das erste Auftreten einer Textübereinstimmung mit der gesamten Zeile übereinstimmt. - Vielen Dank für Ihr Feedback. Ich habe ' nicht auf die Groß- und Kleinschreibung geachtet.
gist meine Gewohnheit, Sie haben Recht, es ist nicht notwendig. Ich dachte auch, dass das Löschen von Zeilen das war, was OP wollte. Jetzt ist alles klar. Vielen Dank