在单独的文件中排除电子邮件地址

在单独的文件中排除电子邮件地址

我有一个文件,其中包含数百个电子邮件地址以及其他字符。电子邮件地址始终位于字符“=>”和“<=”之间。因此

=>[email protected]<=

在文本文件中它看起来像这样:

323168fdsafdafsdfj=>[email protected]<=askdjfköj4243j40278012
jköjökajsdöfajsdkf2323323j=>[email protected]<=jököj

如何使用文本处理来排除电子邮件地址并将其写入新文件?

答案1

如果每行有多个地址,如您的示例所示,那么我建议使用 perl - 因为它的正则表达式引擎允许非贪婪匹配:

perl -pe 's/=>.*?<=//g' < file > newfile

您可以尝试在 sed 中合成非贪婪匹配,例如

sed 's/=>[^=]*<=//g' < file > newfile

然而,如果任何电子邮件地址包含该=字符,则此操作将会失败(不确定 RFC 是否允许这样做)。

使用 awk,您可以将输入字段分隔符设为匹配并使用地址的正则表达式(=出于同样的原因,这与 sed 解决方案在地址中存在同样的问题):

awk -F '=>[^=]*<=' '{$1=$1} 1' < file > newfile 

答案2

awk

awk 'gsub("=>.+<=", "", $0)' file > newfile

…这将删除每一行中第一次出现的=>以及其后的所有内容(必须至少有一个字符)直到最后一次出现的<=。如果在同一行中多次出现 ,则可能导致删除多次出现的 之间的部分=>...<=……在这种情况下,您可以更改"=>.+<="为,它将匹配任何字符,但每个前导字符和后续字符之间的"=>[^=]+<="字符除外,并且应该匹配并分别删除每个单个模式,因为中间没有字符,据我所知,它非常接近 awk 中的非贪婪 RegEx 匹配,符合您的要求,顺便说一句,不清楚它是两种情况中的哪一种。==><==>...<==

答案3

用这个

grep -Pio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b' orig_file.txt > only_mails_in_file.txt  

相关内容