2014-04-16 63 views
0

假设电子邮件的正则表达式为[a-zA-Z0-9] + @ [a-zA-Z0-9] +。[a-zA-Z0-9] + ,我想所有的ID部替换到 “客户”,例如使用sed取代部分字符串

[email protected] => [email protected] [email protected] => [email protected]

我可以写点类似于

$ echo [email protected] | 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' 

但是我怎样才能得到域部分没有改变?基本上,问题是在一个字符串中找到一个模式,并仅替代其中的一部分,其余部分不会改变。

+0

使用反向引用。 – devnull

回答

1

可以使用\1捕捉匹配模式的部分与\(..\)并在替换字符串重用它:

echo [email protected] | 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]*\)/[email protected]\1/g' 
+0

谢谢!这样可行。是否只有一对\(,\)并且被称为\ 1?或者可以有多对?再次感谢! –

+0

你可以有多对'\(\)'并且把它们称为'\ 1','\ 2',... –

1

我认为你正在做的太复杂了:

echo [email protected] | sed -e 's/.*@/[email protected]/' 
+0

如果有像mike @和and @这样的东西,这些都不是电子邮件的有效模式。 –

+0

@AlfredZhong真的,但为什么这很重要?不匹配'sed'的字符串部分不会被修改。尝试一下。 – twalberg

+0

@AlfredZhong这是正确的。 'sed'会忽略不匹配的部分。那就是你想要的。 –