Заменить символы в пользовательской части адреса электронной почты

У меня есть список, который выглядит так:

user-name@domain.example user.name@domain.example user_name@domain.example ... 

Я хотел бы заменить любое появление точки в части имени пользователя. Так что:

 user.name@domain.example 

будет выглядеть так:

 user^name@domain.example 

Я попробовал его с помощью sed, но не смог получить регулярное выражение, чтобы применить изменения к части имени пользователя. У вас есть идея для шаблона?

5 Solutions collect form web for “Заменить символы в пользовательской части адреса электронной почты”

Если есть несколько точек, но только одна точка после знака @ (что было бы обычно), вы можете просто изменить все точки и изменить последнее:

 sed 'y/./^/;s/\(@.*\)\^/\1./' 

Если есть потенциально более одной точки как до, так и после знака @, вы можете сделать это рекурсивно с коротким циклом:

 sed ':top;s/\.\(.*@\)/^\1/;ttop' 

Это работает в GNU sed; BSD sed требует новой строки после метки:

 sed ':top s/\.\(.*@\)/^\1/;ttop' 

EDIT: для обработки всех случаев в команде GNU sed или BSD в одной строке:

 sed 'h;s/@.*//;y/./^/;G;s/\n.*@/@/' 

h копирует текущую строку (называемую «пространство образца») в пространство удержания; команда s удаляет @ и все после нее; y работает подобно команде shell tr и в этом случае переводит все точки в каретки; G добавляет новую строку и содержимое пространства удержания в пространство шаблона; то последняя команда s удаляет из новой строки до @ и возвращает @ .

Использовать awk :

 awk -F"@" '{gsub("\.","^",$1)}OFS="@"' file 
  • -F"@" ограничивает ввод с помощью @ .
  • gsub() заменяет все точки символом ^ в первом поле $1 (часть имени перед @ ).
  • OFS задает разделитель выходного поля.

Если у вас есть только одна точка, вы можете использовать

 sed 's/\.\(.*\)@/^\1@/' 

который совпадает с точкой, затем захватывает остальные до @ и заменяет их на ^ , захват и @ .

Вот как я сделал бы это с sed .

 sed ':start s/^\([^@]*\)\./\1^/; t start;' "$@" 

:start – это метка для перехода к.

^\([^@]*\)\. является регулярным выражением (aka regex ), которое соответствует в начале строки 0 или более любого символа, кроме знака at, а затем точка. Значения \( и \) означают обратную ссылку, которая означает, что все, что соответствует закрытому шаблону, можно ссылаться на заменяемой стороне \1 .

\1^ является заменой . \1 заменяется любым соответственным \([^@]*\) в регулярном выражении. Обводка (^) заменит точку, уведомление которой было исключено из обратной ссылки.

t – это sed- тест, который будет переходить к данной метке, если предыдущая запись была успешной. Это позволяет сценарию заменить более одной точки на адрес электронной почты.

Система, которая имеет sed и awk, также часто имеет perl, и если вы открыты для решения perl, попробуйте

 perl -ne '($user, $domain) = split "@"; $user =~ s/\./^/g; print "$user\@$domain"' 

Пока ваши адреса электронной почты являются довольно нормальными, и каждая строка содержит один адрес (и ничего больше), это работает прямолинейно: разделите адрес на @ , замените все периоды в первой части каретками и распечатайте две части вместе как адрес электронной почты.

Вы также можете получить хитрость и сделать это:

 perl -pe 's/\.(?=.*@)/^/g' 

который использует регулярное выражение для замены любого периода, который предшествует символу @ с кареткой. Насколько я знаю, это зависит от ожидаемого утверждения, функции, которая не реализована в привычных выражениях sed или awk. Я предполагаю, что это может быть медленнее для длинных списков, но запускайте собственные тесты и посмотрите, имеет ли это значение.

  • Ошибка вывода цвета Bash
  • Как вставить текст в качестве альтернативы из двух файлов с общим шаблоном
  • Согласование шаблонов и удаление этого шаблона с помощью sed
  • вопрос о совпадении пробелов
  • Удалять заголовки и содержимое из плоского файла, если они находятся ниже определенного количества строк
  • сохранить только определенную часть строки в определенном столбце
  • Развернуть переменную среды из PIPE (SHELL)
  • У Busybox ASH внутри initrd есть проблема, когда трубопроводный тройник
  • Использование sed из оболочки андроида
  • Добавить слова в список слов с помощью sort -u avoinding duplicata
  • Как экспортировать данные в терминал в файл (например, файл csv)
  • Как избежать кавычек в оболочке как при использовании ssh, так и sudo?
  • Linux и Unix - лучшая ОС в мире.