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

如何用Sed提取含点单词的最后段并保留无点单词?

解决Sed处理含点单词保留最后一段的问题

我来帮你搞定这个sed的需求!你想要的是把每个包含点(.)的单词只保留最后一段内容,不含点的单词原样保留,之前的命令只处理了最后一个目标单词,是因为用了整行的贪婪匹配,没法遍历所有单词。

正确的Sed命令

直接用全局替换来处理每个单词:

echo "Here this.is.a.start is a very.nice.String that.is.the.end yes " | sed -E 's/([^ ]*\.)+([^ ]*)/\2/g'

如果需要兼容不支持扩展正则的基础sed版本,可以用转义后的写法:

echo "Here this.is.a.start is a very.nice.String that.is.the.end yes " | sed 's/\([^ ]*\.\)\+\([^ ]*\)/\2/g'

执行后会输出你期望的结果:

Here start is a String end yes 

命令细节解释

  • -E:启用扩展正则表达式,让括号和+这类元字符不用转义,写法更简洁直观
  • s/.../.../g:末尾的g表示全局替换,会处理一行中所有符合规则的单词,而不是只处理第一个匹配项
  • ([^ ]*\.)+:匹配一个或多个「非空格字符+点」的片段(比如this.is.a.或者very.nice.),+确保至少匹配一次,覆盖所有含点的单词结构
  • ([^ ]*):捕获每个含点单词里最后一段非空格字符,也就是我们要保留的目标内容(比如start、String)
  • \2:替换成第二个捕获组的内容,精准保留每个含点单词的最后一段

为什么之前的命令失效?

你之前的命令用了.*[ ]这种整行级别的贪婪匹配,会直接跳到最后一个空格前的位置,所以只能处理最后一个含点单词,没法对每个单词单独处理。而上面的正则是针对单个单词的结构设计的,能逐个遍历并处理所有符合条件的单词。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 13:42:29