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
谢谢!
答案 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