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

Uts*_*sav 5 regex unix linux sed

我有一些脚本,在不同的领域很多电子邮件地址(比如domain1.com,domain2.com我想用一些通用的电子邮件地址,以取代所有的人都在一个共同的领域,比如说domain.com,保持脚本相同的休息.

我在下面使用sed但它似乎不起作用.(它返回相同的输出作为输入,所以看起来搜索不匹配.但是,当我\S+@\S+/在在线测试器中测试正则表达式时,它似乎匹配电子邮件地址.)

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

例如,我有2个脚本

$ 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
Run Code Online (Sandbox Code Playgroud)

我的结果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
Run Code Online (Sandbox Code Playgroud)

我在用 Linux 3.10.0-327.28.2.el7.x86_64

有什么建议吗?

更新:我设法使它工作's/\S\+@\S\+.com/genericid@domain.com/g'.以前有2个问题search.

  • +需要\之前.
  • 由于文件有其他@行(用于数据库连接),我必须.com在最后添加,因为我的所有地址都以.com

Mar*_*ger 1

更新- 其他答案以及对此的评论指出,您可能需要采取额外的步骤来启用速记字符类匹配;我习惯在 perl 中执行正则表达式,这只是工作,所以没有想到解决这种可能性。这个答案仅解决了正则表达式正常运行后如何改进匹配。

--

虽然将电子邮件地址与正则表达式匹配的问题可能非常复杂(事实上,在最常见的情况下,使用真正的正则表达式是不可能的),但您可能可以处理您的特定情况。

您所遇到的问题是 \S 匹配任何非空格,因此address@something.com,address@somethingelse.com,如果两个地址之间没有空格,则匹配不正确。

因此,基于了解您实际会看到的地址类型,有几种方法可以解决此问题。一种解决方案是将两个实例替换\S[^\s,](注意小写的 s),这只是,从匹配中排除空格。