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

