【发布时间】:2016-07-25 04:04:19
【问题描述】:
我有一个以制表符分隔的数据库表转储,我需要匿名化这些文件中的所有电子邮件。我在 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 插入替换中,例如 anon101@anonmized.ano。我得出以下结论:
sed -ri "s/^([0-9]+)(.*[{(=><`' \t,\"\"])([^{(=><`' \t,\"\"]+@[^={<`'@ \t,\"\"]+\.[a-zA-Z]{2,})(.*)$/\1\2anon\1@anonimized.ano\4/g" *.txt
所以任何字符{(=><`' \t," 都可以标记电子邮件的开头。电子邮件始终包含@,后跟一个点和两个或多个字母。
但现在我的问题是它只捕获每行的最后一封电子邮件,而不是每行上的所有电子邮件。请在此处提供帮助。
【问题讨论】:
-
grep -rli *.txt在后续文件中搜索第一个文件的名称。 -
那么您的
grep非常不标准。试试看:echo 00text.txt >00text.txt然后尝试grep -rli 00text.txt 00text.txt与grep -rli *.txt。在所有 *.txt 文件上运行sed的标准方法就是sed script *.txt(但如果你在 Windows 上,各种奇怪的变态都是可能的)。 -
@tripleee 我将编辑我的帖子以简化它,去掉
grep和xargs -
所以说清楚:我的问题是正则表达式对第一组的引用包含 ID。并且包含电子邮件地址的第三组可以存在多次,尽管引用只捕获最后一次出现。