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

标签 linux bash sed sh

假设邮件的正则表达式是[a-zA-Z0-9]+@[a-zA-Z0-9]+.[a-zA-Z0-9]+,我想全部替换id 部分变成“客户”,例如

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'

关于linux - 使用 sed 替换字符串的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23117937/

相关文章:

无法访问 ifreq 结构定义,__USE_MISC 宏未定义

linux - 如何在 Vim 中的行首和行尾添加/*?

python - 在连续两行中打印字符串匹配之前的行

sed - 从json参数获取值不起作用(jq : 1 compile error)

linux - Grep - 如何将文件名连接到文件内容的每个返回行?

linux - 如何在新行上获取 diff 命令的输出

linux - 让用户验证密码

bash - Grep 匹配前每行中的所有字符

linux - sed 替换为十六进制

php - 使用 .htaccess 将所有请求重定向到 index.php