Как удалить доменную часть каждой строки из текстового файла, содержащего адреса электронной почты

Как удалить доменную часть каждой строки из текстового файла, содержащего адреса электронной почты

У меня есть текстовый файл с одним адресом электронной почты на строку. Как мне удалить часть домена, но не часть TLD из каждой строки? Здесь мы бы определили TLD как последний элемент строки после последнего символа точки.

Другими словами, пример ввода:

[email protected]
[email protected]
[email protected]
[email protected]

Желаемый результат:

foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk

решение1

$ sed 's/@.*[.]/@/' file
foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk

Регулярное выражение @.*[.]захватывает все от @до последней точки .в строке. Мы заменяем это на @.

решение2

С использованиемperl

perl -pe 's/(@).*\.(.*)$/\1\2/' foo

или встроенный

perl -i -pe 's/(@).*\.(.*)$/\1\2/' foo

Пример

$ cat foo
[email protected]
[email protected]
[email protected]
[email protected]

$ perl -pe 's/(@).*\.(.*)$/\1\2/' foo
foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk

Объяснение RegEx

/(@).*\.(.*)$/

  • 1-я группа захвата ( @)

    @соответствует персонажу @буквально

  • .*соответствует любому символу (кроме новой строки)

    Квантификатор: *От нуля до неограниченного количества раз, столько раз, сколько возможно, возвращая по мере необходимости [жадный]

    \.соответствует персонажу .буквально

  • 2-я группа захвата ( .*)

    .*соответствует любому символу (кроме новой строки)

    Квантификатор: *От нуля до неограниченного количества раз, столько раз, сколько возможно, возвращая по мере необходимости [жадный]

  • $установить позицию в конце строки

Визуализация регулярных выражений

Демо Debuggex

решение3

Используя awkвы можете сделать это таким образом

$awk '{ sub(/\@.*\./,"@"); print }' file


foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk

Используя subфункцию Substitute (найти и заменить), вы можете искать шаблон и заменять его.

Связанный контент