【问题标题】:anonymize multiple emails per line每行匿名多封电子邮件
【发布时间】: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

所以任何字符{(=&gt;&lt;`' \t," 都可以标记电子邮件的开头。电子邮件始终包含@,后跟一个点和两个或多个字母。

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

【问题讨论】:

  • grep -rli *.txt 在后续文件中搜索第一个文件的名称。
  • 那么您的grep 非常不标准。试试看:echo 00text.txt &gt;00text.txt 然后尝试 grep -rli 00text.txt 00text.txtgrep -rli *.txt。在所有 *.txt 文件上运行 sed 的标准方法就是 sed script *.txt(但如果你在 Windows 上,各种奇怪的变态都是可能的)。
  • @tripleee 我将编辑我的帖子以简化它,去掉grepxargs
  • 所以说清楚:我的问题是正则表达式对第一组的引用包含 ID。并且包含电子邮件地址的第三组可以存在多次,尽管引用只捕获最后一次出现。

标签: regex windows sed


【解决方案1】:

awk

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

【讨论】:

  • 我在哪里声明要更改的文件名?
  • 将 awk 打印输出重定向到文件本身。编辑答案。
猜你喜欢
  • 1970-01-01
  • 2015-10-13
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 2015-05-29
  • 2016-07-17
  • 1970-01-01
相关资源
最近更新 更多