首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在一行中应用两个不同的sed命令?

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

Stack Overflow用户
提问于 2012-06-06 02:15:58
回答 3查看 231关注 0票数 0

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

代码语言:javascript
复制
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命令将@替换为_

代码语言:javascript
复制
sed 's/@/_/' <filename>

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

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

代码语言:javascript
复制
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:假设我的例子是这样的,

代码语言:javascript
复制
peter@yahoo.com
peter@hotmail.co.in,i am peter

我希望我的结果如下,

代码语言:javascript
复制
peter_yahoo.com@generic.com
peter_hotmail.co.in@generic.com,i am peter,i am peter

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

下面的cmd将导致,

代码语言:javascript
复制
sed -r 's!@(.*)!_\1@generic.com!' FILE

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

下面的命令在"peter@yahoo.com“上不起作用,

代码语言:javascript
复制
sed -r 's!@(.*)(,.*)!_\1@generic.com!' FILE

谢谢!!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-06 02:36:21

高尔夫=)

代码语言:javascript
复制
$ 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的回复,下面是一些解释:

代码语言:javascript
复制
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 (基本正则表达式)模式中的相同代码片段:

代码语言:javascript
复制
 sed 's!@\(.*\)!_\1@generic.com!' FILE

编辑以满足您的新需求:

代码语言:javascript
复制
$ 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

如果你只想要电子邮件行,你可以这样做:

代码语言:javascript
复制
sed -r '/@/s!@(.*),.*!_\1@generic.com!' FILE

/@/部件的意思是只在包含字符@的行上工作

Edit2

如果你想保留结尾行,就像你的新评论所说的:

代码语言:javascript
复制
sed -r 's!@(.*)(,.*)!_\1@generic.com\2!' FILE
票数 0
EN

Stack Overflow用户

发布于 2012-06-06 02:25:34

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

代码语言:javascript
复制
sed -e cmd -e cmd

或

代码语言:javascript
复制
sed -e cmd;cmd

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

代码语言:javascript
复制
sed -e 's/@/_/' -e 's/_.*/_generic.com/' filename

但这样做似乎更容易

代码语言:javascript
复制
sed 's/@.*/_generic.com/' filename
票数 0
EN

Stack Overflow用户

发布于 2012-06-06 02:26:02

代码语言:javascript
复制
sed 's/\(.*\)@\(.*\)\..*/\1_\2@generic.com/'

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

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10902612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档