每行匿名化多封电子邮件

时间:2016-04-05 09:39:05

标签: regex windows sed

我有一个以制表符分隔的数据库表转储,我需要匿名化这些文件中的所有电子邮件。我在Windows服务器上使用sed。以下是文件的演示摘录:

101 some guy has this email: someguy@gmail.com
102 `someguy@yahoo.com` has backticks but (someguy@yahoo.com) has parens
103 <b>someother@gmail.com</b> is bold but "someother@gmail.com" has double quotes and {someother@gmail.com} has curly braces around it
104 'somegal@gmail.com' has single quotes

我首先制定了一些可以将所有电子邮件更改为anon@anonmized.ano的内容。它甚至可以在同一行上收到多封电子邮件:

sed -ri "s/[^{(=><`' \t,\"\"]+@[^={><`'@ \t,\"\"]+\.[a-zA-Z]{2,}/anon@anonimized.ano/g" *.txt

但是,虽然相同的电子邮件可以在同一行的多个列中使用,但它不能在不同行的同一列上使用。 (列具有唯一约束。)在替换中插入一些随机数字失败后,我考虑将ID插入替换,EG anon101@anonmized.ano。我制定了以下内容:

sed -ri "s/^([0-9]+)(.*[{(=><`' \t,\"\"])([^{(=><`' \t,\"\"]+@[^={<`'@ \t,\"\"]+\.[a-zA-Z]{2,})(.*)$/\1\2anon\1@anonimized.ano\4/g" *.txt

因此任何字符{(=><`' \t,"都可以标记电子邮件的开头。电子邮件总是包含一个@,后跟一个点和两个或更多字母。

但现在我的问题是它只捕获每行的最后一封电子邮件,而不是每行的所有电子邮件。请你的帮助。

1 个答案:

答案 0 :(得分:0)

使用awk

awk '{gsub(/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+/,"anon"$1"@anonmized.ano",$0);print >(FILENAME)}' *.txt