如何在一行上应用两个不同的sed命令?

时间:2012-06-05 18:15:58

标签: shell sed

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

谢谢!

3 个答案:

答案 0 :(得分:0)

您可以使用以下命令运行多个命令:

sed -e cmd -e cmd

sed -e cmd;cmd

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

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

但似乎更容易做到

sed 's/@.*/_generic.com/' filename

答案 1 :(得分:0)

sed 's/\(.*\)@\(.*\)\..*/\1_\2@generic.com/'

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

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

\(.*\)\.之后的表达式@用于记住电子邮件ID(yahoo,hotmail,gmail)的结尾。换句话说,它说:在@.

之间取一些东西

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

答案 2 :(得分: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

/@/部分表示仅适用于包含字符@

的行

<强> EDIT2

如果你想像你的新评论一样保留结束线:

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