111(222)333111(222)333
那么提取的匹配就是这个部分了
-------------------------------------
[root@mail root]# echo "111(222)333"| sed 's/\(.*\)(\(.*\))/\1\1\1/'
111111111333
因为//里面是由\(.*\) 和 (\(.*\))两部分组成,而\1仍然是提取第一部分,也就是(222)前的所有内容和(222)这个整个部分替换为(222)前的所有内容提取三次,其后的333不变
[root@mail root]# echo "111(222)333"| sed 's/\(.*\)(\(.*\))/\2\2\2/'
222222222333
将(222)前的所有部分和(222)看成一个整体,被替换为()内的部分,也就是222。
此处理解\2\2\2,2的含义应该是提取第二个\(.*\)即:“第二个包含” 得意思也就是:(将()换成yy也是一样得含义)
[root@mail root]# echo "111y222y333"| sed 's/\(.*\)y\(.*\)y/\2\2\2/'
222222222333
-------------------------------------
两个括号及其以上得情况:
[root@mail root]# echo "no1=100(AAA) no2=100(BBB) no3=100(CCC) no4=(DDD)" | sed 's/\(.*\)(\(.*\)).*/\2/'
DDD
[root@mail root]# echo "no1=100(AAA) no2=100(BBB) no3=100(CCC) no4=(DDD)" | sed 's/.*(\(.*\)).*/\1/'
DDD
以上两句意义相同。
我们本想取到AAA,但是为什么取了DDD呢
正则表达式是有贪婪性的,它总是与最长的可能长度匹配,而且越是排在前面的通配符优先级越高。按照这样的原则取到得就是DDD了,那么我们应该如何取得AAA呢?
我们考虑如果在模式串中第一个.*中告诉sed这个.*是不能含有"("的,同时第二个.*中不能含有")"应该OK吧
试一试:
[root@mail root]# echo "no1=100(AAA) no2=100(BBB) no3=100(CCC) no4=(DDD)" | sed 's/[^(]*(\([^)]*\)).*/\1/'
AAA
以此类推,可以得到
[root@mail root]# echo "no1=100(AAA) no2=100(BBB) no3=100(CCC) no4=(DDD)" | sed 's/[^(]*(\([^)]*\))[^(]*(\([^)]*\))[^(]*(\([^)]*\))[^(]*(\([^)
]*\))/\2/'
BBB
将2改为3就是CCC
将3改为4就是DDD
评论