usuń wiersze zawierające określony tekst w pliku

Mam plik z listą wiadomości e-mail, w którym każdy wiersz zawiera e-mail. Chcę usunąć wiersze zawierające ciąg example.com lub test.com.

Próbowałem tego:

sed -i "s/example\.com//ig" file.txt 

Ale usunie tylko ciąg example.com, jak mogę usunąć całą linię?

Odpowiedź

Z GNU sed:

sed "/example\.com/d;/test\.com/d" -i file.txt 

usunie linie z example.com i test.com.

From man sed:

d Delete pattern space. Start next cycle. 

Komentarze

  • Spowoduje to również usunięcie wiersza zawierającego example (lub test), po którym następuje dowolny znak, a następnie com. Przykład echo 'exampleAcom' | sed '/example.com/d'
  • O rany, głupi ja z roztargnieniem nie uciekam przed kropką. Dziękuję za uwagę!

Odpowiedź

POSIXly, możesz użyć grep:

grep -Eiv "(example|test)\.com" <in >out 

Komentarze

  • Uważaj, aby nie używać tego samego pliku jako wejścia i wyjścia lub zostanie obcięty, zanim grep będzie mógł go przeczytać.

Odpowiedź

Twoje wyrażenie regularne pasuje tylko do example.com i sed zastępuje tylko example.com s pustym strunowy. Twoje wyrażenie regularne powinno pasować do dowolnego wiersza zawierającego example.com lub test.com

sed -i "s@.*\(test\|example\)\.com.*@@i" file.txt 

Komentarze

  • Twój odpowiedź nie usuwa pasujących linii; to tylko czyni je pustymi. – Nie obsługuje również tekstu bez rozróżniania wielkości liter (jak na przykładzie OP '). -. g jest zbędne / bez znaczenia, ponieważ sed ‍ ' jest chciwy i dlatego początkowy i końcowy .* spowoduje, że pierwsze wystąpienie dopasowania tekstu będzie pasowało do całej linii. ‍
  • Dziękujemy za opinię. Nie ' nie zwróciłem uwagi na rozróżnianie wielkości liter. g to mój nawyk, masz rację, nie jest to konieczne. Pomyślałem też, że OP chciał wygasić linię. Teraz wszystko jest jasne. Dzięki

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *