如何用通用电子邮件地址替换一组文件中的所有电子邮件地址

5

我有一些脚本,其中有许多不同域名的电子邮件地址(例如 domain1.comdomain2.com)。我想将它们全部替换为一个通用域名下的泛用电子邮件地址,例如 domain.com,同时保持脚本其余部分不变。

我正在使用以下命令 sed,但是它似乎无法起作用。(它返回与输入相同的输出,因此看起来搜索无法匹配。然而,当我在在线测试器中测试正则表达式 \S+@\S+/ 时,似乎它可以匹配电子邮件地址。)

s/\S+@\S+/genericid@domain.com/g

例如,我有两个脚本:

$ cat script1.sh
abcd.efg@domain.com
export SENDFROM="xyz@domain1.com" blah_4

$ cat script2.sh
echo foo|mailx -s "blah" pqr@domain2.com,def@domain.com,some@domain.com
 omg@domain.com
foo abc@domain.com bar

sed -i命令执行后我的结果应该是:

$ cat script1.sh
genericid@domain.com
export SENDFROM="genericid@domain.com" blah_4

$ cat script2.sh
echo foo|mailx -s "blah" genericid@domain.com,genericid@domain.com,genericid@domain.com
 genericid@domain.com
foo genericid@domain.com bar

我正在使用Linux 3.10.0-327.28.2.el7.x86_64

请问有什么建议吗?

更新: 我已经通过's/\S\+@\S\+.com/genericid@domain.com/g'使其正常工作。之前的search有两个问题。

  • +需要在它前面加上\.
  • 由于文件中还有其他的@行(用于数据库连接),因此我必须在末尾添加.com,因为我所有的地址都以.com结尾。

它有什么问题? - Eli Sadoff
哦,抱歉。我忘了提到。它返回与输入相同的输出。已经使用相同的输入编辑了问题。 - Utsav
4个回答

2
使用正则表达式捕获电子邮件地址可能比看起来更困难。无论如何,对于替换域名,我认为您可以简单地考虑电子邮件域从以下内容开始:

1个字母数字字符 + @ + N个字母数字字符 + . + N个字母数字字符

基于这种预设,在JavaScript中,我会这样做:

(\w@)(\w*.\w*)

替换为:

$1newdomain.com

希望它能帮到您。


1
感谢您的回答。我通过使用 's/\S\+@\S\+.com/genericid@domain.com/g' 成功实现了它,因为我所有的地址都以 .com 结尾。 - Utsav

1
更新 - 其他答案和对此回答的评论指出,您可能需要采取额外措施来启用速记字符类匹配;我习惯于在Perl中进行正则表达式操作,所以没有考虑到这种可能性。此答案仅介绍如何在您的正则表达式生效后改善匹配效果。

--

虽然使用正则表达式匹配电子邮件地址的问题可能非常复杂(实际上,在最一般的情况下,这是不可能用真正的正则表达式实现的),但您可能可以处理您特定的情况。您所面临的问题在于 \S 匹配任何非空格字符,因此没有空格的两个地址 address@something.com,address@somethingelse.com 会被错误地匹配。因此,有几种方法可以解决这个问题,基于您所能看到的电子邮件地址类型。其中一种解决方案是将 \S两个实例都替换为 [^\s,](请注意小写字母 s),它简单地将 , 排除在匹配范围之外,以及空格。

你的解释很有道理,但是当我使用s/\S+@[^\S,]+/genericid@domain.com/g时,我得到的输出与输入相同。 - Utsav
1
在基本的正则表达式中,\S代表非空白字符,而S则代表字母"S"本身。这就是你遇到困难的原因。 - Toby Speight
1
@Usav - 除了Toby的建议(我不知道的;显然我已经使用perl太长时间),您评论中的表达式也不是我推荐的正确应用方式,有两个原因。(1)在新表达式中,\s必须是小写而不是大写;(2)您需要替换两个 \S 实例。 - Mark Adelsberger
我成功地使用's/\S\+@\S\+.com/genericid@domain.com/g' 让它工作了。问题在于需要对 + 符号进行转义处理。之后我遇到了另一个问题,但通过在结尾硬编码.com来解决了。感谢您的帮助。 - Utsav

0

虽然仍与UNIX相关,但需要更现代而非普及工具Ammonite,您可以使用email-replace

$ amm path/to/email-replace.sc <random integer seed> <file1 with emails> <file2 with emails> ...

免责声明:匹配器可能远非完美,因此使用时请自行承担风险,并始终备有备份。 请注意,默认情况下,它会用新的随机电子邮件地址替换电子邮件。要使用固定的电子邮件地址,只需将对randEmail的调用替换为常量字符串即可。


0

试试这个

sed s/[^,@]*@[^,]*/genericid@domain.com/g

并且

echo 'pqr@domain2.com,def@domain.com,some@domain.com' | sed s/[^,@]*@[^,]*/genericid@domain.com/g

结果

genericid@domain.com,genericid@domain.com,genericid@domain.com

尝试添加一些解释吧;-) - GhostCat
它正在删除包含电子邮件地址的行的剩余部分。因此,export SENDFROM="xyz@domain1.com" blah_4 被替换为 genericid@domain.com - Utsav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接