You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用sed删除字符串中每个@后不含/的所有内容?

用sed实现需求的解决方案

根据给出的示例,实际要实现的转换规则是:

  • 如果字符串里包含/,就只保留最后一个/之后的所有内容;
  • 如果字符串里没有/,就只保留最后一个@之后的所有内容;

可以直接用这条sed命令完成:

sed -E 's|.*\/(.*)|\1|; t; s|.*@(.*)|\1|'

命令解释

  • s|.*\/(.*)|\1|:用|做分隔符(避免和路径里的/冲突),匹配最后一个/及其前面的所有内容,把整个字符串替换成/后面的部分;
  • t:如果上面的替换成功(也就是字符串里有/),就跳过后面的命令,直接输出结果;
  • s|.*@(.*)|\1|:如果上面的替换没成功(字符串里没/),就匹配最后一个@及其前面的所有内容,替换成@后面的部分;

测试验证

把你的测试输入用这个命令跑一遍,结果完全符合预期:

# 测试1
echo "user@host" | sed -E 's|.*\/(.*)|\1|; t; s|.*@(.*)|\1|'
# 输出:host

# 测试2
echo "user:password@host" | sed -E 's|.*\/(.*)|\1|; t; s|.*@(.*)|\1|'
# 输出:host

# 测试3
echo "user:passw@rd@host" | sed -E 's|.*\/(.*)|\1|; t; s|.*@(.*)|\1|'
# 输出:host

# 测试4
echo "host:/foo@bar" | sed -E 's|.*\/(.*)|\1|; t; s|.*@(.*)|\1|'
# 输出:foo@bar

# 测试5
echo "host://foo@bar" | sed -E 's|.*\/(.*)|\1|; t; s|.*@(.*)|\1|'
# 输出:foo@bar

# 测试6
echo "user:password@host:/foo@bar" | sed -E 's|.*\/(.*)|\1|; t; s|.*@(.*)|\1|'
# 输出:foo@bar

内容的提问来源于stack exchange,提问作者nfl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 07:54:55