sed实例备忘
需求:
修改所有automation script目录下的build config file。每个feature下面都会有至少一个个build config file,文件名为:build.cfg, build_6.9.cfg ...
需要在每个build config file搜索 关键字:INCLUDE_PING 或 INCLUDE_PING6.
如果找到了关键字,则需要插入:INCLUDE_IPPING_CMD 或 INCLUDE_IPPING6_CMD
而关键字出现的位置可能有四种:
1. 开头,但不是结尾:
vip_components_t1 = "INCLUDE_PING /
这种情况需要插入目标行到关键字行下面行即可;
目标效果:
vip_components_t1 = "INCLUDE_PING /
INCLUDE_IPPING_CMD /
2. 中间,非开头非结尾:
vip_components_t2 = "INCLUDE_SHELL /
INCLUDE_SHELL_INTERP_CMD /
INCLUDE_PING /
INCLUDE_PING6 /
INCLUDE_IPPING6_CMD"
这种情况,需要添加目标行到关键字上方或者上方都可以。
目标效果:
vip_components_t2 = "INCLUDE_SHELL /
INCLUDE_SHELL_INTERP_CMD /
INCLUDE_PING /
INCLUDE_IPPING_CMD /
INCLUDE_PING6 /
INCLUDE_IPPING6_CMD /
INCLUDE_IPPING6_CMD"
3. 结尾。
vip_components_t2 = "INCLUDE_SHELL /
INCLUDE_SHELL_INTERP_CMD /
INCLUDE_PING"
这种情况,需要添加目标行到关键字行的上一行。
目标效果:
vip_components_t2 = "INCLUDE_SHELL /
INCLUDE_SHELL_INTERP_CMD /
INCLUDE_IPPING_CMD /
INCLUDE_PING"
4. 开头,同时也是结尾
vip_components_t2 = "INCLUDE_PING"
这种情况稍微复杂一些,需要插入目标行到关键字行下方,同时关键字之后的双引号也要替换成反斜线。
目标效果:
vip_components_t2 = "INCLUDE_PING /
INCLUDE_IPPING_CMD"
解决方案:
分析之后,其实情况1, 2都可以用一个sed表达式解决,情况3 需要另外写一个表达式。 由于情况4的case很少,而且稍微复杂一些,没有用sed解决(留着以后思考)
sed 表达式:
find . -name "build*.cfg" |xargs sed -e '/INCLUDE_PING/>/s*///a/ INCLUDE_IPPING_CMD/ //' -e '/INCLUDE_PING6/>/s*///a/ INCLUDE_IPPING6_CMD/ //' -e '/[^/"]/s*INCLUDE_PING/>/s*/"/i/ INCLUDE_IPPING_CMD/ //' -e '/[^/"]/s*INCLUDE_PING6/>/s*/"/i/ INCLUDE_IPPING6_CMD/ //' -i
该表达式解决了情况1,2,3, 为了解决情况4:
find . -name "build*.cfg" |xargs grep -niHr /"INCLUDE_PING/"
然后根据搜索出来的文件名,分别手动修改(笨方法)。