Как можно вырезать адреса электронной почты с помощью sed?

Как можно вырезать адреса электронной почты с помощью sed?

У меня есть следующие emails.txt с:

[email protected]
[email protected]
[email protected];es
[email protected]
[email protected]
@pepito.com 

И команда sed для получения

sed -n -r '/\w+@\w+\.\w+((\.\w+)*)?/p' emails.txt 

[email protected]
[email protected] 

Но он продолжает отображать электронную почту с более чем одним .com

Мне не нужны эти письма:

[email protected]
[email protected];es
[email protected] 
@pepito.com 

Я застрял здесь и понятия не имею, как его получить.

решение1

С помощью sedвы можете сделать:

$ sed -nr '/^[^@]+@[^.]+\.com\s*$/p' file
[email protected]
[email protected]

Регулярное выражение ищет один или несколько не- @символов в начале строки, затем символ @, затем один или несколько не- .символов, за которыми следует символ .com, а затем 0 или более пробелов.


Другие варианты:

  • Перл

    perl -ne 'print if /^[^@]+@[^.]+\.com\s*$/' file
    
  • ГНУgrep

    grep -P '^[^@]+@[^.]+\.com\s*$' file
    
  • POSIXgrep

    grep -E '^[^@]+@[^.]+\.com\s*$' file
    
  • awk

    awk '$0~/^[^@]+@[^.]+\.com\s*$/' file
    

решение2

Я бы использовал что-то вроде этого:

sed -n -r '/\w+@\w+\.com$/p' emails.txt

[email protected]
[email protected]

Он извлечет каждое электронное письмо в формате[email protected]

Если вам нужно что-то более «универсальное» и не только, .comно и также .fr, .ukвы можете использовать:

sed -n -r '/\w+@\w+\.\w+$/p' emails.txt

Это позволит получить все электронные письма в формате[email protected]

решение3

Выражение ((\.\w+)*)?соответствует дополнительным последовательностям формы .xyzпосле первого домена. Если вы хотите сопоставитьтолькоэти адреса с одним доменом, то вы можете обеспечить это, заменив его на $или (что более надежно)\s*$

sed -n -r '/\w+@\w+\.\w+\s*$/p' emails.txt

требовать, чтобы между первым доменом и концом строки не было ничего (кроме, возможно, пробелов).

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