如何使用sed实现基于反向引用是否一致的条件文本替换
实现方案
核心逻辑为利用正则原生反向引用实现内容相等校验,按优先级顺序编排sed规则,无需复杂分支或额外工具依赖,即可完全匹配需求。
完整执行命令
sed -E \ -e 's#µ(bar1|bar2|bar3)>([^|¢]+)\|\2¢#:\1:`\2`#g' \ -e 's#µ(bar1|bar2|bar3)>([^|¢]+)\|([^µ|]+)¢#:\1:`\3 <\2>`#g' \ -e 's#µ(bar1|bar2|bar3)>([^|¢µ]+)¢#:\1:`\2`#g'
规则设计说明
- 第一条规则优先处理特殊场景:匹配带
|分隔符、且|前后内容完全一致的片段。通过正则内的反向引用\2,和>后捕获的内容做强相等校验,直接替换为简化格式:barX:内容,避免后续规则重复处理 - 第二条规则处理普通带分隔符场景:保留原有带
|的替换逻辑。由于上一条规则已经把前后内容相等的片段全部替换完成,这条规则匹配到的自然都是前后内容不等的场景,直接输出带链接的格式即可 - 第三条规则保留原有无分隔符场景的处理逻辑,专门匹配无
|的纯文本片段,输出简化格式
效果验证
测试输入:
Bla bla bla µbar1>foo|baz¢ bla bla bla µbar2>foo|foo¢ bla bla bla. Bla bla bla µbar3>foo¢ bla bla bla.
执行命令后的输出结果:
Bla bla bla :bar1:`baz <foo>` bla bla bla :bar2:`foo` bla bla bla. Bla bla bla :bar3:`foo` bla bla bla.
完全符合预期输出要求。
方案优势
- 100%兼容原有匹配逻辑,保留了
[^|¢]这类排除分隔符的写法,支持同一行多匹配、匹配片段被前后文本包裹的场景 - 无额外工具依赖,语法风格和原有命令完全统一,无晦涩的跳转标签或临时变量操作
- 同时支持GNU sed、BSD sed跨平台运行
内容的提问来源于stack exchange,提问作者Denis Bitouzé
相关产品推荐
相关产品推荐

