GNU Sed搜索模式反向引用的工作原理及案例输出差异疑问
GNU Sed 搜索模式中的反向引用工作机制及实例解析
反向引用的基本原理
- Sed 中用
\( \)标记正则表达式里的捕获分组,分组按左括号出现的顺序从 1 开始编号 - 反向引用通过
\n(n 为分组编号)调用对应分组捕获到的内容 - Sed 的正则匹配默认是贪婪模式:优先匹配最长的符合规则的字符串,当最长匹配无法满足整个模式时,会逐步回溯缩短匹配长度,直到找到可行的匹配项。
第一个实例解析:echo -e 'one.onetwo' | sed -n 's/\(.*\)\.\1/x/p'
输入字符串为 one.onetwo,匹配过程如下:
- 模式
\(.*\)\.\1要求匹配「任意长度字符串 + 点 + 和前面字符串完全相同的内容」 - 贪婪模式下,
\(.*\)先尝试最长匹配:one,此时后面的内容是.one,正好和\1(即捕获到的one)对应,完全符合模式要求 - 将匹配到的
one.one替换为x,剩余的two保留,最终输出xtwo
第二个实例解析:echo -e 'one.two' | sed -n 's/\(.*\)\.\1/x/p'
输入字符串为 one.two,匹配过程如下:
- 首先尝试最长匹配:
\(.*\)匹配one,但后面的.two和\1(one)不匹配,无法满足模式 - 开始回溯:依次缩短
\(.*\)的匹配长度,尝试on、o,均无法让后续内容与\1匹配 - 直到
\(.*\)匹配空字符串,此时\1也为空,模式简化为匹配单个.(即\.\1等价于\.) - 将匹配到的
.替换为x,原字符串one.two就变成了onextwo
内容的提问来源于stack exchange,提问作者Enlico
相关产品推荐
相关产品推荐

