
У меня есть текстовый файл с одним адресом электронной почты на строку. Как мне удалить часть домена, но не часть 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-я группа захвата (
.*
).*
соответствует любому символу (кроме новой строки)Квантификатор:
*
От нуля до неограниченного количества раз, столько раз, сколько возможно, возвращая по мере необходимости [жадный]$
установить позицию в конце строки
решение3
Используя awk
вы можете сделать это таким образом
$awk '{ sub(/\@.*\./,"@"); print }' file
foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk
Используя sub
функцию Substitute (найти и заменить), вы можете искать шаблон и заменять его.