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

GNU Sed搜索模式反向引用的工作原理及案例输出差异疑问

GNU Sed 搜索模式中的反向引用工作机制及实例解析

反向引用的基本原理

  • Sed 中用 \( \) 标记正则表达式里的捕获分组,分组按左括号出现的顺序从 1 开始编号
  • 反向引用通过 \n(n 为分组编号)调用对应分组捕获到的内容
  • Sed 的正则匹配默认是贪婪模式:优先匹配最长的符合规则的字符串,当最长匹配无法满足整个模式时,会逐步回溯缩短匹配长度,直到找到可行的匹配项。

第一个实例解析:echo -e 'one.onetwo' | sed -n 's/\(.*\)\.\1/x/p'

输入字符串为 one.onetwo,匹配过程如下:

  1. 模式 \(.*\)\.\1 要求匹配「任意长度字符串 + 点 + 和前面字符串完全相同的内容」
  2. 贪婪模式下,\(.*\) 先尝试最长匹配:one,此时后面的内容是 .one,正好和 \1(即捕获到的 one)对应,完全符合模式要求
  3. 将匹配到的 one.one 替换为 x,剩余的 two 保留,最终输出 xtwo

第二个实例解析:echo -e 'one.two' | sed -n 's/\(.*\)\.\1/x/p'

输入字符串为 one.two,匹配过程如下:

  1. 首先尝试最长匹配:\(.*\) 匹配 one,但后面的 .two 和 \1(one)不匹配,无法满足模式
  2. 开始回溯:依次缩短 \(.*\) 的匹配长度,尝试 on、o,均无法让后续内容与 \1 匹配
  3. 直到 \(.*\) 匹配空字符串,此时 \1 也为空,模式简化为匹配单个 .(即 \.\1 等价于 \.)
  4. 将匹配到的 . 替换为 x,原字符串 one.two 就变成了 onextwo

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 06:55:02