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

403
Joao

Я использую 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]" /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 5 лет назад 1
Достойный старт с форматированием. Даунвот отозван. Kamil Maciorowski 5 лет назад 0
Привет Камиль, отформатировал его, пожалуйста, дайте мне знать, если вам покажется более приятным. Кстати, знаете ли вы, что нужно обновить в этой команде? Спасибо Joao 5 лет назад 0
Подсказка: чтобы обратиться к другому пользователю в комментарии, синтаксис похож на @KamilMaciorowski. Пожалуйста, прочтите раздел «Ответы в комментариях» [здесь] (https://superuser.com/editing-help#comment-formatting). Суть в том, что "Hello Kamil" не отправит мне никакого уведомления, но "@Kamil" отправит. Kamil Maciorowski 5 лет назад 0
Здравствуйте @slhck, спасибо за ответ. Я изменил @ на (foo | bar) в моем примере команды, тогда она не вызвала какие-либо электронные письма, даже те, которые были @ с ... Joao 5 лет назад 0
О, хорошо @KamilMaciorowski :) Joao 5 лет назад 0
Еще один совет: обратная косая черта в самом конце строки заставляет оболочку анализировать следующую строку, как если бы они были одной строкой. Я использовал эту функцию, когда редактировал вопрос; Общие оболочки должны понимать, и читаемость для людей была улучшена. Вы вернули его обратно, и теперь оно снова выглядит ужасно. Я не буду бороться за форматирование, это ваш вопрос. Я просто хочу сообщить вам, что мои изменения не должны были нарушить команду. Kamil Maciorowski 5 лет назад 0
Joao, очевидно, вы не должны использовать `(foo | bar)`, так как это будет совпадать, только если кто-то буквально наберет `foo` или` bar`. Это был просто пример. Вам необходимо заменить `foo` и` bar` соответствующими альтернативами для `@`, которые вы хотите захватить. slhck 5 лет назад 1
Здравствуйте @slhck, спасибо за ответ. Я заменил @ следующим: * (@ | (at) | [at] | @ |% 40 |% 26% 23064% 3B) * и все они, кроме (at) и [at], работают, если я добавить что-нибудь еще? Спасибо Joao 5 лет назад 0
@ Камил, как вы помещаете цветное форматирование фона в эти маленькие комментарии, такие как (foo | bar), написанное выше, с цветным фоном? Joao 5 лет назад 0
Смотрите мое последнее изменение к вопросу. Такие галочки работают и в комментариях. Kamil Maciorowski 5 лет назад 0
Привет @Kamil, я не заметил, что ты изменил это, возможно, это было, когда я тестировал, как форматировать в то же самое время, когда ты также форматировал это. Joao 5 лет назад 0
ОК, без вреда. Когда дело доходит до форматирования вопросов и ответов, вы можете нажать «изменить» на других хорошо отформатированных сообщениях и узнать, как это делали другие пользователи (затем вы отменяете свои изменения, если таковые имеются). С комментариями это не так просто, но у вас есть [это] (https://superuser.com/editing-help#comment-formatting). `Код в кавычках` есть. Kamil Maciorowski 5 лет назад 0
@ Камил, хорошо, спасибо. Кстати, знаете ли вы, как мне добавить `(at)` и `[at]` в приведенном выше примере `(foo | bar)` в командной строке, который я изменил на `(@ | (at) | [at] | @ |% 40 |% 26% 23064% 3B) `? Но это не опровергает `(at)` и `[at]`. Спасибо Joao 5 лет назад 0
`()` и `[]` имеют особое значение для регулярных выражений. Полагаю, вам нужно их избежать: `(@ | \ (at \) | \ [at \] | @ |% 40 |% 26% 23064% 3B)`. Kamil Maciorowski 5 лет назад 0
@Kamil, он копирует `[at]` и `(at)` с обратными слешами, но исчезает с тем, что стоит перед `@` в этих письмах, а также исчезает с тем, что перед `@` Joao 5 лет назад 0
Возможный дубликат [Grep с несколькими шаблонами, используемыми в команде] (https://superuser.com/questions/1112366/grep-with-multiple-patterns-used-on-the-command) phuclv 5 лет назад 0
@phuclv спасибо за ответ, я прочитал твой пример, но не смог найти способ использовать его здесь. Теперь мне нужно только знать, как написать `[at]` и `(at)` внутри этого `(foo | bar)` без проблем в регулярном выражении. Joao 5 лет назад 0
вы можете использовать grep для нескольких форматов одновременно, например, `grep -e" format1 "-e" format2 "...` phuclv 5 лет назад 0

1 ответ на вопрос

1
Toto

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

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

\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 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]" file.txt  info@example.com info@example.com info(at)example.com info[at]example.com info%26%23064%3Bexample.com info%40example.com 
@Joao: вам нужно добавить опции `-or`, чтобы они стали` grep -Pior .... `, если вы хотите рекурсивно grep для всех файлов и выводить только совпадающую часть. Toto 5 лет назад 1

Похожие вопросы