我有一个文件,其中包含数百个电子邮件地址以及其他字符。电子邮件地址始终位于字符“=>”和“<=”之间。因此
在文本文件中它看起来像这样:
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