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\"
然後根據搜索出來的文件名,分別手動修改(笨方法)。