sed 反向引用 "\1"问题,请大师能指点一下?
she Elik my Elov (替换错误)
ruk@DESKTOP-C1QB9VR:~$ echo "she like my love" | sed "s/\(l..\)e/\1E/g"
she likE my lovE
分组如果出现在字符串的前部,想把e 换成E,但如果\1的位置不同,E 出现的位置就不同。这个例子中\1放在E的前面,可以正常替换,为什么?
ruk@DESKTOP-C1QB9VR:~$ echo "she like my love" | sed "s/l\(..e\)/\1L/g"
she ikeL my oveL (替换错误)
ruk@DESKTOP-C1QB9VR:~$ echo "she like my love" | sed "s/l\(..e\)/L\1/g"
she Like my Love
分组如果出现在某个字符串的后部,想吧l 换成L,如果\1的位置不同,L出现的位置也不同。这个例子\1放在L的后面,可以正常替换,为什么? 展开
楼主你好,
我讲下重点吧:
就是替换命令中的" \n ",表示对前面分组的一个引用,举例来说:
s/ \(abc\) \(def\) \(ghi\) / \2 \1 \3 / //为了方便阅读我加了很多空格,下面实际讲解假设空格不存在.
对于上面这个例子,模式匹配部分有3个分组,从左到右分别为:
\(abc\) 在替换部分可以使用\1来引用内容abc
\(def\) 在替换部分可以使用\2来引用内容def
\(ghi\) 在替换部分可以使用\3来引用内容ghi
现在我要将上面的替换应用到内容为"I am abcdefghi"的行,而执行的过程你可以这样理解:
首先abcdefghi能够匹配上替换命令中的模式,所以此时你可以先将abcdefghi从内容中抠去,
则此时行内容变为:
I am * //*号一会会用替换的部分代替
替换的部分为\2\1\3,此时对号入座,\2是def,\1是abc,\3是ghi,则\2\1\3合起来就是defabcghi,最后将*给替换掉,即是最后结果:
I am defabcghi
-----------------------------
再来说你的例子:
ruk@DESKTOP-C1QB9VR:~$ echo "she like my love" | sed "s/\(l..\)e/E\1/g"
she Elik my Elov (替换错误)
ruk@DESKTOP-C1QB9VR:~$ echo "she like my love" | sed "s/\(l..\)e/\1E/g"
she likE my lovE
上面两个原理其实一样,就一起说了,你模式匹配部分是" \(l..\)e ",也就是说你想匹配的是字母l后面跟着两个任意字符,最后是e,特别要说明的是你将字母l后面跟着两个任意字符给放到了组中,因为你只有一个分组,所以后面肯定是使用\1来引用这个分组中的内容,按照前面讲的替换过程,
首先, " \(l..\)e "这个模式匹配上了字符串" she like my love "中的like和love,而处理的过程是匹配一个处理一个,所以先看like,由于有" \(\) ",所以产生了一个组,内容为" lik ",我们先使用*将模式匹配上的部分替换掉,则此时字符串变成了:
she * my love
下一步再看替换部分的内容 " E\1 ", " E "就是字母" E ",而" \1 "使用模式匹配中产生的组内容" lik "替换,合起来就是" Elik ",将上一步的*给换掉,你得到的结果是:
she Elik my love
由于往后走,还有一个匹配," love ", 还是先将匹配上的内容用*替换掉,得到:
she Elik my *
"love"在模式匹配中" lov "是匹配的是分组" \(l..\) ", " e "匹配它本身" e ",再看替换部分的内容," E\1 ",首先 " E "匹配本身" E "," \1 "匹配前面的分组" lov ",合起来就是" Elov ",使用该内容替换掉上一步的*,得到最终结果:
she Elik my Elov
第二个得到正确结果的匹配过程我就不写了,你自己套一下应该就出来了
希望对你有帮助,欢迎追问
*.最后说一句可能对你有帮助的理解: 模式匹配到的部分使用*替换,具体替换成啥完全看后面替换部分的内容,大多数情况下唯一和模式匹配相关联的就是替换部分可能会用到模式匹配中的分组内容