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

Shell 如何在一行上应用两个不同的sed命令?,shell,sed,Shell,Sed,问题1: 我想编辑一个包含一组电子邮件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> 我试过了,而不是* 它不起作用,我想不出

问题1: 我想编辑一个包含一组电子邮件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>
我试过了,而不是* 它不起作用,我想不出任何其他解决办法

问题3: 假设我的例子是这样的

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实现这一点

以下命令将导致

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

谢谢

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

sed -e cmd -e cmd

因此,在您的情况下,您可以:

sed -e 's/@/_/' -e 's/_.*/_generic.com/' filename
但这似乎更容易做到

sed 's/@.*/_generic.com/' filename
带转义括号\.*\的表达式用于记住正则表达式的部分内容。\1是第一个记住的模式,\2是第二个记住的模式

@前面的表达式\.*\用于记住电子邮件id peter,peter,philip的开头

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

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

Golfing=

$ 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
回复用户1428900,以下是一些解释:

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
/@/part表示仅在包含字符的行上工作@

编辑2:

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

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

你能解释一下你的sed指令吗?好了,请看我的解释。如果你需要,我会在那里。哇,谢谢!那么,如果我的域名末尾有文本,我该如何处理这个问题呢?实例peter@yahoo.com,我是彼得peter@hotmail.co.in,我也是彼得,我尝试了,而不是。*它不起作用,我想不出任何其他解决方案。你应该再读一遍,解决方案已经存在。也许这篇文章值得投票!?你的意思是你不想考虑,我是。*部分吗?是的,只是想澄清一下,这个例子的结构是这样的:@,我希望我的结果是:@,
$ 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
sed -r 's!@(.*)(,.*)!_\1@generic.com\2!' FILE