Как grep нескольких типов @?


1

Я использую Linux Centos 6-64.

Как я могу изменить следующую команду , который получает только письма, написанные с @, внутри входной папки:

grep -E -o -r "[A-Za-z0-9][A-Za-z0-9._%+-]+@[A-Za-z0-9][A-Za-z0-9.-]+\.[A-Za-z]{2,6}" /inputfolder/ | sort | uniq > "/outputfolder/result.txt"

получить электронную почту во всех этих @ форматах ниже?

info@example.com
info@example.com
info(at)example.com
info[at]example.com
info%26%23064%3Bexample.com
info%40example.com

Если возможно, команда в одну строку. Спасибо


1
Вы можете использовать такие группы, как (foo|bar) вместо буквального @,
slhck

Достойный старт с форматированием. Даунвот отозван.
Kamil Maciorowski

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

Подсказка: чтобы обратиться к другому пользователю в комментарии, синтаксис похож на @KamilMaciorowski. Пожалуйста, прочитайте раздел «Ответ в комментариях» Вот , Суть в том, что "Hello Kamil" не отправит мне никакого уведомления, но "@Kamil" отправит.
Kamil Maciorowski

1
Joao, очевидно, вы не должны использовать (foo|bar), так как это будет соответствовать только если кто-то буквально набрал foo или же bar, Это был просто пример. Вам нужно заменить foo а также bar с соответствующими альтернативами для @ что вы хотите захватить.
slhck

Ответы:


1

Вы могли бы использовать -P флаг для регулярного выражения Perl и -i без учета регистра:

grep -Pi "[A-Z0-9][\w.%+-]+(?:@|@|\(at\)|\[at\]|%26%23064%3B|%40)[A-Z0-9][A-Z0-9.-]+\.[A-Z]{2,6}"

\w обозначает [a-zA-Z0-9_]

Объяснение:

[A-Z0-9]            : 1 alphanum
[\w.%+-]+           : 1 or more alphanum, _, ., %, + or -
(?:                 : start non capture group
    @               : literally @
  |                 : OR
    @          : html entity for @
  |                 :
    \(at\)          :
  |                 :
    \[at\]          :
  |                 :
    %26%23064%3B    :
  |                 :
    %40             :
)                   :
[A-Z0-9]            : 1 alphanum
[A-Z0-9.-]+         : 1 or more alphanum, . or -
\.                  : a dot
[A-Z]{2,6}          : 2 upto 6 alpha (be aware that TLDs may have much more characters, see: https://www.iana.org/domains/root/db)

Результат для данного примера:

grep -Pi "[A-Z0-9][\w.%+-]+(?:@|@|\(at\)|\[at\]|%26%23064%3B|%40)[A-Z0-9][A-Z0-9.-]+\.[A-Z]{2,6}" file.txt

info@example.com
info@example.com
info(at)example.com
info[at]example.com
info%26%23064%3Bexample.com
info%40example.com

1
@Joao: вы должны добавить -or варианты так становится grep -Pior .... если вы хотите выполнить рекурсивный поиск всех файлов и вывести только соответствующую часть.
Toto
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.