Разбор строк электронной почты Outlook, нужен только текст smtp-адреса угловой скобки - PullRequest
2 голосов
/ 19 июня 2020

У меня есть строка

Casperfoo DataOps <casperf@domain .com>;Booya Support <iptsupport@domain .com>; Tripped Support <Tsupport@domain capital.com>; Smith, Joe: IB Reference Data (NYK) <joe.smith@domain .com>; Johnson, Walter: IB Reference Data (PUN) <walter.johnson@domain .com>;

, и я бы ожидал, что это сработает

cat  /tmp/foo | perl -nle 'print /\<(\w+)\>/'

, но это не так. Все, что мне нужно, это строка между <и>. Мне не нужны дрянные псевдонимы Outlook - только адреса smtp.

Это ожидаемый результат

casperf@domain.com 
iptsupport@domain.com 
Tsupport@domaincapital.com  
joe.smith@domain.com 
walter.johnson@domain.com

Ответы [ 2 ]

3 голосов
/ 19 июня 2020

и я бы ожидал, что это сработает

Тогда ваши ожидания неверны :-) Возможно, вы станете ближе, если прочитаете документацию по регулярным выражениям ( или учебник ).

Некоторые проблемы:

  1. Вы совпадаете с \w+. Управляющая последовательность \w соответствует буквам, цифрам и знаку подчеркивания. Адреса электронной почты содержат другие символы (например, @), поэтому это ничего не соответствует. Давайте заменим \w+ на \S+ (чтобы соответствовать всем непробельным символам).
  2. Это по-прежнему не работает, так как все ваши адреса электронной почты содержат пробел (например, <casperf@domain .com>). Хорошо, давайте вместо этого будем использовать <.+>, чтобы сопоставить что-либо, но добавим ?, чтобы добиться минимального совпадения - <.+?>.
  3. Это просто дает нам первое совпадение, потому что это то, что мы просим . Нам нужно добавить /g к оператору сопоставления, чтобы получить все совпадения.

Теперь у нас есть:

$ cat  /tmp/foo | perl -nle 'print /\<(.+?)\>/g

Что дает нам:

casperf@domain .comiptsupport@domain .comTsupport@domain capital.comjoe.smith@domain .comwalter.johnson@domain .com

Итак, мы получаем все совпадения, но все они находятся в одной строке. Самое простое исправление - поместить совпадение в постфикс for l oop, чтобы print() получал совпадения по одному:

$ cat  /tmp/foo | perl -nle 'print for /\<(.+?)\>/g'
casperf@domain .com
iptsupport@domain .com
Tsupport@domain capital.com
joe.smith@domain .com
walter.johnson@domain .com
1 голос
/ 19 июня 2020

Попробуйте следующее:

cat /tmp/foo | perl -nle 'while (/<([^>]+)>/g){ print $1; }'

Должно сработать. Пробовал с

echo "Casperfoo DataOps <casperf@domain .com>;Booya Support <iptsupport@domain .com>; Tripped Support <Tsupport@domain capital.com>; Smith, Joe: IB Reference Data (NYK) <joe.smith@domain .com>; Johnson, Walter: IB Reference Data (PUN) <walter.johnson@domain .com>;" | perl -nle 'while (/<([^>]+)>/g){ print $1; }'

, что дало мне:

casperf@domain .com
iptsupport@domain .com
Tsupport@domain capital.com
joe.smith@domain .com
walter.johnson@domain .com
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...