Linux 使用sed替换字符串的一部分

Linux 使用sed替换字符串的一部分,linux,bash,sed,sh,Linux,Bash,Sed,Sh,假设电子邮件的正则表达式为[a-zA-Z0-9]+@[a-zA-Z0-9]+.[a-zA-Z0-9]+,我想将所有id部分替换为“customer” mike@yahoo.com => customer@yahoo.com john@gmail.com => customer@gmail.com 我可以写一些像这样的东西 $ echo mike@yahoo.com | sed 's/[a-zA-Z0-9][a-zA-Z0-9]*@[a-zA-Z0-9][a-zA-Z0-9]*\.[a-zA-Z0

假设电子邮件的正则表达式为[a-zA-Z0-9]+@[a-zA-Z0-9]+.[a-zA-Z0-9]+,我想将所有id部分替换为“customer”

mike@yahoo.com => customer@yahoo.com john@gmail.com => customer@gmail.com

我可以写一些像这样的东西

$ echo mike@yahoo.com | sed 's/[a-zA-Z0-9][a-zA-Z0-9]*@[a-zA-Z0-9][a-zA-Z0-9]*\.[a-zA-Z0-9][a-zA-Z0-9]*/customer/g' 

但是如何才能使域部分不被更改?基本上,问题是在字符串中找到一个模式,只替换其中的一部分,其余部分不变

您可以使用
\(..\)
捕获匹配模式的部分,并使用
\1
在替换字符串中重新使用它:

echo mike@yahoo.com | sed 's/[a-zA-Z0-9][a-zA-Z0-9]*@\([a-zA-Z0-9][a-zA-Z0-9]*\.[a-zA-Z0-9][a-zA-Z0-9]*\)/customer@\1/g'

我觉得你把事情弄得太复杂了:

echo mike@yahoo.com | sed -e 's/.*@/customer@/'

如果有像迈克、安迪这样的东西,这些都不是有效的电子邮件模式。@AlfredZhong是真的,但这又有什么关系呢?字符串中与
sed
不匹配的部分将不会被修改。试试看。@AlfredZhong这是对的
sed
将忽略不匹配的部分。这就是你想要的。谢谢,但要求的是替换只发生在有效的电子邮件模式上,像mike@这样的东西不应该被替换。“另一个家伙”的回答就是我要找的for@AlfredZhong好吧,原来的问题没有说明,如果是这样的话,那么即使是公认的答案也不够笼统-例如,有有效的电子邮件在域名后缀中包含3个或更多部分,在用户名中包含2个或更多部分,还有一些字符在集合
[A-Za-z0-9]
之外也是可以接受的(例如
\u
)…谢谢!这很有效。是否只能有一对(,)和被称为\1?或者可以有多对?再次感谢!