Как мне получить "sed", чтобы удалить все остальное, кроме адреса электронной почты. - PullRequest
3 голосов
/ 14 декабря 2010

как мне заставить "sed" удалить все остальное, кроме адреса электронной почты.

db dump: someusername ::: kRW...0fPc ::: $2a$10$...aucvkDt86 ::: joesmith@gmail.com

Ответы [ 4 ]

20 голосов
/ 14 декабря 2010

Должен ли он быть sed? Что насчет grep? Вот как использовать его с заданным вами регулярным выражением:

$ cat dbdump.txt 
db dump: someusername ::: kRW...0fPc ::: $2a$10$...aucvkDt86 ::: joesmith@gmail.com
another line with two e-mail addresses <test@example.com> on it -- bob@example.org

$ grep -EiEio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b' dbdump.txt
joesmith@gmail.com
test@example.com
bob@example.org

Флаг -o печатает только соответствующие части, то есть только адреса электронной почты. -i делает регистр нечувствительным к регистру. Он даже находит несколько адресов электронной почты в одной строке.

Редактировать: Я не мог устоять перед -EiEio. Я полагаю, что grep -Eio или egrep -io также будет работать ...

0 голосов
/ 14 декабря 2010

Для этого требуется GNU sed:

sed -r 's/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}/\n&\n/ig;s/(^|\n)[^@]*(\n|$)/\n/g;s/^\n|\n$//g;/^$/d' inputfile
  • разделить строки ввода, чтобы адреса электронной почты и другие строки разделялись символами новой строки
  • Стереть последовательности, которые состоят только из не-@ символов, разделенных символами новой строки или началом или концом строки ввода
  • стереть лишние новые и пустые строки
0 голосов
/ 14 декабря 2010

Следующее будет работать независимо от того, где адрес электронной почты находится в строке, но только , если в строке один адрес электронной почты. Если их больше одного, будет отображаться только последний в строке. Он также не затрагивает линии, в которых нет действительных адресов электронной почты

sed 's/^.* \([^@ ]\+@[^ ]\+\) \?.*$/\1/'

Input

$ cat dbdump
this line with no valid @ email address is untouched
::: a0$...aucvkDt86 ::: joesmith@gmail.com
::: a0$... foo@example.com db dump: someusername :::

выход

$  sed 's/^.* \([^@ ]\+@[^ ]\+\) \?.*$/\1/' ./dbdump
this line with no valid @ email address is untouched
joesmith@gmail.com
foo@example.com
0 голосов
/ 14 декабря 2010

С sed:

$ echo "db dump: someusername ::: kRW...0fPc ::: $2a$10$...aucvkDt86 ::: joesmith@gmail.com"|sed 's/.*::: //' joesmith@gmail.com 

С awk:

$ echo "db dump: someusername ::: kRW...0fPc ::: $2a$10$...aucvkDt86 ::: joesmith@gmail.com"|awk '{print $NF}'

РЕДАКТИРОВАТЬ: Учитывая новую информацию в вашем комментарии - довольно сложно сделать то, что вы спрашиваете безлюбая закономерность.Проверьте раздел Синтаксис здесь:

Стандарт говорит, что, например, 1$%3{C}@example.com является действительным адресом электронной почты (хотите верьте, хотите нет).Вы даже можете процитировать его (пример, приведенный в статье - John Doe@example.com).Таким образом, следуя стандарту, почти невозможно распознать действительный адрес электронной почты.

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

cat your-file.txt|grep @

, то сделайте некоторые из вышеперечисленных.Вы даже можете сделать что-то вроде этого:

$ echo "garbage John.Doe123@example.com garbage"|sed 's/[^@]* \([a-zA-Z0-9.]*@[^ ]*\).*/\1/'
John.Doe123@example.com

Обратите внимание, что вышеприведенное работает при следующих допущениях:

  • Перед адресом электронной почты есть пробел
  • Тамнет пробелов в самом адресе электронной почты
  • В строке один адрес электронной почты (фактически он получит только первый, поэтому может работать более чем с одним)
  • local-part (все до @) содержит только буквы (строчные или прописные), цифры и точку

Расширьте набор символов ([a-zA-Z0-9.]), так как вы хотите сделать его менее ограничительным- Например, вы можете сделать [a-zA-Z0-9.-_], чтобы включить - и _.

...