我有一根线
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发布于 2020-06-19 15:16:54
和我都希望这能行得通
那么你的期望是错误的:-)如果你阅读the regex documentation (或the tutorial),也许你会更接近。
一些问题:
\w+匹配。转义序列\w匹配字母、数字和下划线。电子邮件地址包含其他字符(例如,@),因此不匹配任何字符。让我们将\w+替换为\S+ (以匹配所有非空格characters).<casperf@domain .com>)。好的,让我们使用<.+>来匹配任何东西,但是添加?来强制最小匹配- <.+?>./g以获取所有匹配。我们现在有:
$ cat /tmp/foo | perl -nle 'print /\<(.+?)\>/g这就给我们提供了:
casperf@domain .comiptsupport@domain .comTsupport@domain capital.comjoe.smith@domain .comwalter.johnson@domain .com所以我们得到了所有的匹配,但它们都在同一条线上。最简单的解决方法是将匹配项放在一个后缀for循环中,这样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发布于 2020-06-19 14:53:21
试试这个:
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 .comhttps://stackoverflow.com/questions/62464618
复制相似问题