2016-11-15 97 views
4

我有一些脚本,在不同的领域有很多的电子邮件地址(比如domain1.comdomain2.com。我想在一些通用的电子邮件地址,以取代所有的人一个普通的域名,说domain.com,保持其余的脚本相同如何与普通的电子邮件地址替换所有电子邮件地址中的一组文件

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

s/\[email protected]\S+/[email protected]/g

例如,我有2个脚本

$ cat script1.sh 
[email protected] 
export SENDFROM="[email protected]" blah_4 

$ cat script2.sh 
echo foo|mailx -s "blah" [email protected],[email protected],[email protected] 
[email protected] 
foo [email protected] bar 

sed -i后,我的结果应该是

$ cat script1.sh 
[email protected] 
export SENDFROM="[email protected]" blah_4 

$ cat script2.sh 
echo foo|mailx -s "blah" [email protected],[email protected],[email protected] 
[email protected] 
foo [email protected] bar 

我使用Linux 3.10.0-327.28.2.el7.x86_64

任何建议吗?

更新: 我设法使其与's/\S\[email protected]\S\+.com/[email protected]/g'工作。有2问题与以前search

  • +需要\之前。
  • 作为文件有其他@线(用于 数据库连接),我不得不在最后追加.com,因为我所有的 地址在.com
+0

有什么不适用于它? –

+0

对不起。忘了提及。它返回与输入相同的输出。用相同的输入编辑问题。 – Utsav

回答

1

UPDATE结束 - 其他的答案,并在此评论一,指出你可能需要采取额外的步骤来启用速记字符类匹配;我已经习惯了在Perl,其中这只是工作做正则表达式,所以没有想到要解决这种可能性。这个答案只解决了如何改进匹配,一旦你有正则表达式运作。

-

虽然电子邮件地址与正则表达式匹配可以是非常复杂的问题(在最一般的情况下,实际上是不可能与真正的正则表达式),你可能可以处理你的具体情况。

与你有什么问题是,\ S任何非空白,所以[email protected],[email protected],其中两个地址之间有没有空格相匹配,匹配不当。

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

+0

你的解释是有道理的,但是当我使用's \\ S + @ [^ \ S,] +/genericid @ domain.com/g'时,我得到的输出与输入相同。 – Utsav

+1

在一个基本的正则表达式中,'\ S'字面上代表'\'和'S'。这就是为什么你遇到困难。 –

+1

@Usav - 除了Toby的建议(我没有意识到;显然我一直使用perl的时间太长了),在评论中的表达也不是我推荐的正确应用,原因有两个。 (1)在新的表达式中,'\ s'必须是小写的,而不是大写; (2)您需要替换** **'\ S'实例 –

2

捕获使用正则表达式可以比它似乎更棘手的电子邮件不会忽略。 总之,更换域名,我想你可以简单地认为,电子邮件域时,发现开始:

1 alphanum char + @ + N alphanum chars + . + N alphanum chars

基于这种偏见,在JavaScript我会做所以:

(\ W @)(\ w * \ W *)。

与更换:

$ 1newdomain.com

希望它可以帮助你。

+1

感谢您的回答。我设法使用它的'/ s \ + @ \ S \ +。com/genericid @ domain.com/g'',因为我拥有以'.com'结尾的所有地址。 – Utsav