2014-04-16 62 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'會忽略不匹配的部分。那就是你想要的。 –