Entfernen Sie Zeilen, die einen bestimmten Text in einer Datei enthalten.

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 (oder test) gefolgt von einem beliebigen Zeichen, dann com. Beispiel echo '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, da sed 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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.