2012-06-05 49 views
0

Q1: 我想编辑一个包含一组电子邮件ID的文件,以便所有的域名都变得通用。如何在一行上应用两个不同的sed命令?

Example, 
[email protected] 
[email protected] 
[email protected] 

to 
[email protected] 
[email protected] 
[email protected] 

我用下面的sed CMD,以取代@ _

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

是否有其他的sed CMD追加到上面这样提到的CMD,我可以替换域名的最后一部分的方式@ generic.com的名字?

Q2: 那么如果我的域名末尾有文字,我该怎么办?

Example, 
[email protected],i am peter 
[email protected],i am also peter 

To, 
[email protected],i am peter 
[email protected],i am also peter 

我试图@(,)而不是@ 它不工作,我想不出任何其他解决方案

Q3的(*): 想,如果我的例子是这样的,

[email protected] 
[email protected],i am peter 

我希望我的结果如下,

[email protected] 
[email protected],i am peter,i am peter 

我怎么办TH是单一的sed命令?

以下CMD会导致,

sed -r '[email protected](.*)!_\[email protected]!' FILE 

[email protected] 
peter_hotmail.co.in,i am peter,i am [email protected] 

和关于 “[email protected]” 下面的CMD不会工作,

sed -r '[email protected](.*)(,.*)!_\[email protected]!' FILE 

谢谢!

+0

你的意思是你不想照顾',我是。*'的一部分吗? –

+0

是啊,我只想澄清,示例的结构是这样的: @我希望我的结果是: _ @ user1428900

+0

见注释#2在我的岗位 –

回答

0

高尔夫=)

$ cat FILE 
Example, 
[email protected] 
[email protected] 
[email protected] 

$ sed -r '[email protected](.*)!_\[email protected]!' FILE 
Example, 
[email protected] 
[email protected] 
[email protected] 

在回答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 
_\[email protected] # an "_" + the captured group N°1 + "@generic.com" 
!    # end delimiter 
FILE   # file-name 
是不是真的需要有

扩展模式,考虑BRE同下面的代码片段(基本的正则表达式)模式:

sed '[email protected]\(.*\)!_\[email protected]!' FILE 

编辑,以适应新的需求:

$ cat FILE 
Example, 
[email protected],I am peter 
[email protected] 
[email protected] 


$ sed -r '[email protected](.*),.*!_\[email protected]!' FILE 
Example, 
[email protected] 
[email protected] 
[email protected] 

如果你只想要电子邮件线,你可以做这样的事情:

sed -r '/@/[email protected](.*),.*!_\[email protected]!' FILE 

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

线

EDIT2:如果你想保持到底线

就像你的新评论说的那样:

sed -r '[email protected](.*)(,.*)!_\[email protected]\2!' FILE 
+0

它的工作原理!谢谢 你能解释一下你的命令吗? – user1428900

+0

完成,看我的解释。如果你需要,我在那里。 –

+0

谢谢! 那么如果我的域名末尾有文字,我该如何处理? 实施例, 彼得@ yahoo.com,我是彼得 彼得@ hotmail.co.in,我也是彼得 我试图@(,)代替@(。*) 它不” t工作,我不能想到任何其他解决方案 – user1428900

0

您可以运行多个命令:

sed -e cmd -e cmd 

sed -e cmd;cmd 

所以,你的情况,你可以这样做:

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

,但它似乎更容易只是做

sed 's/@.*/_generic.com/' filename 
0
sed 's/\(.*\)@\(.*\)\..*/\1_\[email protected]/' 

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

@用于记忆电子邮件ID(彼得,彼得,菲利普)的开头之前的表达式\(.*\)

@用于记忆电子邮件ID(雅虎,Hotmail,Gmail)的结束之后的表达式\(.*\)\.。换句话说,它表示:@.

在端部中的表达.*之间用于匹配在电子邮件ID所有尾随的符号采取一些(.COM,.co.in,.co.in) 。

+0

能否请您解释你的sed cmd? – user1428900