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
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
example
(lubtest
), po którym następuje dowolny znak, a następniecom
. Przykładecho 'exampleAcom' | sed '/example.com/d'