0

Q1:我想编辑一个包含一组电子邮件 ID 的文件,以便所有域名都变得通用。

Example,
peter@yahoo.com
peter@hotmail.co.in
philip@gmail.com

to
peter_yahoo@generic.com
peter_hotmail@generic.com
philip_gmail@generic.com

我使用以下 sed cmd 将 @ 替换为 _

sed 's/@/_/' <filename>

有没有办法将另一个 sed cmd 附加到上面提到的 cmd 中,以便我可以用 @generic.com 替换域名的最后一部分?

Q2:如果我的域名末尾有文字,我该如何处理?

Example,
peter@yahoo.com,i am peter
peter@hotmail.co.in,i am also peter

To,
peter_yahoo.com@generic.com,i am peter
peter_hotmail.co.in@generic.com,i am also peter

我尝试了 @(,) 而不是 @(.*) 它不起作用,我想不出任何其他解决方案

Q3:假设我的例子是这样的,

peter@yahoo.com
peter@hotmail.co.in,i am peter

我希望我的结果如下,

peter_yahoo.com@generic.com
peter_hotmail.co.in@generic.com,i am peter,i am peter

如何使用单个 sed cmd 执行此操作?

以下 cmd 将导致,

sed -r 's!@(.*)!_\1@generic.com!' FILE

peter_yahoo.com@generic.com
peter_hotmail.co.in,i am peter,i am peter@generic.com

以下 cmd 无法在“peter@yahoo.com”上运行,

sed -r 's!@(.*)(,.*)!_\1@generic.com!' FILE

谢谢!!

4

3 回答 3

0

打高尔夫球 =)

$ cat FILE
Example,
peter@yahoo.com
peter@hotmail.co.in
philip@gmail.com

$ sed -r 's!@(.*)!_\1@generic.com!' FILE
Example,
peter_yahoo.com@generic.com
peter_hotmail.co.in@generic.com
philip_gmail.com@generic.com

回复 user1428900,这是一些解释:

sed -r          # sed in extended regex mode
s               # substitution
!               # my delimiter, pick up anything you want instead !part of regex
@(.*)           # a literal "@" + capture of the rest of the line
!               # middle delimiter
_\1@generic.com # an "_" + the captured group N°1 + "@generic.com"
!               # end delimiter
FILE            # file-name

那里并不真正需要扩展模式,请考虑BRE(基本正则表达式)模式中的以下相同片段:

 sed 's!@\(.*\)!_\1@generic.com!' FILE

编辑以适应您的新需求:

$ cat FILE
Example,
peter@yahoo.com,I am peter
peter@hotmail.co.in
philip@gmail.com


$ sed -r 's!@(.*),.*!_\1@generic.com!' FILE
Example,
peter_yahoo.com@generic.com
peter@hotmail.co.in
philip@gmail.com

如果您只想要电子邮件行,您可以执行以下操作:

sed -r '/@/s!@(.*),.*!_\1@generic.com!' FILE

/@/部分意味着仅适用于包含该字符的行@

编辑2

如果您想像新评论中所说的那样保留结尾行:

sed -r 's!@(.*)(,.*)!_\1@generic.com\2!' FILE
于 2012-06-05T18:36:20.917 回答
0
sed 's/\(.*\)@\(.*\)\..*/\1_\2@generic.com/'

带有转义括号\(.*\)的表达式用于记住正则表达式的某些部分。“\1”是第一个记住的模式,“\2”是第二个记住的模式。

\(.*\)之前的表达式@用于记住电子邮件 ID 的开头(peter、peter、philip)。

\(.*\)\.后面的表达式@用于记住电子邮件 ID 的结尾(yahoo、hotmail、gmail)。换句话说,它说:在和之间取一些@东西.

末尾的表达式.*用于匹配电子邮件 ID(.com、.co.in、.co.in)中的所有尾随符号。

于 2012-06-05T18:26:02.473 回答
0

You can run multiple commands with:

sed -e cmd -e cmd

or

sed -e cmd;cmd

So, in your case you could do:

sed -e 's/@/_/' -e 's/_.*/_generic.com/' filename

but it seems easier to just do

sed 's/@.*/_generic.com/' filename
于 2012-06-05T18:25:34.457 回答