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
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
grepbę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 '). -.
gjest 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.
gto mój nawyk, masz rację, nie jest to konieczne. Pomyślałem też, że OP chciał wygasić linię. Teraz wszystko jest jasne. Dzięki
example(lubtest), po którym następuje dowolny znak, a następniecom. Przykładecho 'exampleAcom' | sed '/example.com/d'