【问题标题】:substitue part of a string using sed使用 sed 替换字符串的一部分
【发布时间】:2014-05-31 19:51:27
【问题描述】:

假设电子邮件的正则表达式是 [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' 

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

【问题讨论】:

    标签: linux bash sed sh


    【解决方案1】:

    您可以使用\(..\) 捕获部分匹配模式,并使用\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'
    

    【讨论】:

    • 谢谢!这样可行。可以只有一对 (,) 并称为 \1 吗?或者可以有多对?再次感谢!
    【解决方案2】:

    我认为你把它弄得太复杂了:

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

    【讨论】:

    • 如果有类似 mike@、andy@ 的东西,这些都不是电子邮件的有效模式。
    • @AlfredZhong 是的,但这有什么关系呢?字符串中与sed 不匹配的部分不会被修改。试试看。
    • @AlfredZhong 这是正确的。 sed 将忽略不匹配的部分。这就是你想要的。
    • 谢谢,但要求是替换只发生在有效的电子邮件模式上,不应该替换像 mike@ 这样的东西。 @that other guy 的答案就是我要找的
    • @AlfredZhong 好吧,最初的问题没有说明,如果是这样,那么即使是接受的答案也不够普遍 - 例如有效的电子邮件在域后缀中包含 3 个或更多部分,并且在用户名中包含 2 个或更多部分,并且在集合 [A-Za-z0-9] 之外也有可接受的字符(例如 _)...
    猜你喜欢
    • 2021-03-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 2020-07-28
    • 2022-07-18
    • 2017-02-08
    • 1970-01-01
    • 2020-03-13
    相关资源
    最近更新 更多