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
grep
es 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
g
ist redundant / bedeutungslos, dased
div ' 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.
g
ist 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