我无法解决问题。我有一个包含电子邮件地址的文本。我需要这个文件来通过井号更改地址。
例如:
bla bla bla example{at sign}gmail.com
->#######{at sign}#####.###
您可以像这样使用 sed:
sed -r 's/(^| )[^ @]+@[^ ]+/\1#########@#####.###/g' file
Each message has exactly one header, which is structured into fields. #########@#####.### Each field has a name and a value. #########@#####.### RFC 5322 specifies the precise syntax #########@#####.### .
这是一个awk
解决方案
echo "test my@email.com vow" | awk '{split($0,a,"@");f=split(a[1],x," ");for (i=1;i<=(length($f));i++) s=s "#";$f=s}1'
test ############ vow
它保留了长度,但可能会破坏任何不是电子邮件并且具有@
这可能更适用于多封电子邮件:
awk '{gsub(/[^@ ]+@[[:alnum:]]+.[[:alnum:]]+/,"#########")}1' file
问题是你怎么知道你是否有一个电子邮件地址。您可以假设一个模式,例如/[\.\w]+@[\.\w]+\.\w+/
,但这可能包括电子邮件以外的其他内容。你想保持长度,还是一般替换它:
david@foo.com
=>#####@###.###
robert.brown@buffy.fu
=>############@#####.##
或者
david@foo.com
=>#################@##################.###
robert.brown@buffy.fu
=>#################@##################.###
后者可以与sed一起使用s/[\.\w]+@[\.\w]+\.\w+/#################@##################.###/
。请注意,这sed
因系统而异——尤其是关于它可以接受的正则表达式语法类型。至少sed
可以使用三种不同类型的正则表达式:Obsolete(或RE Classic)、Modern(包括一些扩展)和 Extended(如 Perl 和 Python)
sed -E 's/\s*[[:alnum:]\.]+@[[:alnum:]\.]+\.[[:alnum:]]+\s*/######@#####.###/g' rfc-5322.txt
我在 RFC-5322 上对此进行了测试
一个丑陋的oneliner,它将更改文件:
$ cat text
Each message has exactly one header, which is structured into fields. firstemail@gmail.com Each field has a name and a value. secondmail@gmail.com RFC 5322 specifies the precise syntax thirdmail@gmail.com
$ < text egrep -o "\b[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}\b" | sort -u | ( while read b ; do echo "s/$b/$(tr a-z0-9_%+-. \# <<< ${b%@*})@$(tr a-z0-9_%+- \# <<< ${b#*@})/g" ; done ) | xargs -n1 -I{} sed -i,bak {} text
$ cat text
Each message has exactly one header, which is structured into fields. ##########@#####.### Each field has a name and a value. ##########@#####.### RFC 5322 specifies the precise syntax #########@#####.###
我从这里获取了电子邮件正则表达式。我还假设电子邮件左侧的一个点也应该被混淆:first.name@gmail.com --> #########@#####.###