在sed中如何对指定捕获组做后处理同时保留其余捕获组?
解决方案
你可以通过「分隔隔离+局部替换+合并」的通用sed思路实现需求,以下是不需要调用子shell、兼容性更好的纯sed命令:
sed -r 's/([^.]*)\.(.*)\.([^.]*)$/\1\n\2\n\3/; :loop; s/\n([^\n]*)\.([a-zA-Z0-9_-])[^\.]*/\n\1.\2/; t loop; s/\n/./g'
执行逻辑说明
- 拆分隔离:第一步替换将整行拆分为三段,用换行符
\n(普通文本行不会包含该字符)做分隔,拆分后格式为:[第一个点前的内容]\n[中间待缩写内容]\n[最后一个点后的内容] - 局部循环替换:定义循环标签
loop,每次匹配两个换行中间的内容,将.完整单词替换为.单词首字母,只要替换成功就自动跳回loop重复执行,直到中间所有片段都完成缩写 - 合并结果:最后把所有换行符替换回
.,就得到符合要求的输出
测试验证
输入:top-level.subpath.one.subpath.two.subpath.forty-five
执行上述命令后输出:top-level.s.o.s.t.s.forty-five,完全匹配预期要求。
内容的提问来源于stack exchange,提问作者rajatsbugs
相关产品推荐
相关产品推荐

