如何用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
相关产品推荐
相关产品推荐

