- 论坛徽章:
- 0
|
请教:sed匹配记数?比如替换C程序的一个函数体
递归的方法好理解,不过效率不高。 上一种 sed 方法替换 {} 需要 n + 1 次
全扫描。(其中 n 为文件中字符 { 的个数)
下面改进了算法, 用 awk 一次扫描通过, 效率上当然快 m ( 其中 m < n ) 倍了.
其中的 test.c 重复 copy 至 248KB.
新法:
# time sed 's/\([{}]\)/\n\1\n/g' test.c|awk '{ if($1 == "{" {i++; j=1;} else if ($1 == "}" i--; if (i == 0 && j =
= 0 && $0 != "" print; if ( i == 0 ) j=0;} END { if ( i != 0 ) print " Error: Unmatched { and } !!! "}' > aaa
real 0m0.96s
user 0m0.18s
sys 0m0.05s
旧法:
# time sed -e :a -e '$!N; s/\n/ @@@ /;ta' test.c|sed -e :a -e 's/{[^{}]*}//g;ta'|sed 's/\( @@@ \)\{1,\}/\n/g' > aaa
real 3m8.51s
user 0m3.48s
sys 0m0.05s
不过无论新法旧法,考虑到以下情况,要增加语句处理:
1. 注释语句 ( //, /* .. */ , /** ... */) 中含有 { 或}
2. 如果 test.c 有错误,即其中 { 及 } 的总数不同,则结果不对.
在新法中如果最后 i != 0 ,就是这种错误了. |
|