免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2923 | 回复: 8

请教:sed匹配记数?比如替换C程序的一个函数体  关闭 [复制链接]

andywang 该用户已被删除
发表于 2004-10-19 21:06 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
发表于 2004-10-19 23:58 |显示全部楼层

请教:sed匹配记数?比如替换C程序的一个函数体

要什么结果?

论坛徽章:
0
发表于 2004-10-20 03:45 |显示全部楼层

请教:sed匹配记数?比如替换C程序的一个函数体

# cat test.c

//lakjsdfl@
const in dfdf;
int i
main()
{
printf("alsfdj";
if(test)
{
k=x(1);
i=1; }
{ { j=1; }
}
return0;
}
// lsjdgljdfg
int x(int i) {
i++;
return i
}

/* alsfjdklfd*/   


选择一个 test.c 中没有的串, 如 @@@

# sed -e :a -e '$!N; s/\n/ @@@ /;ta' test.c|sed -e :a -e 's/{[^{}]*}//g;ta'|sed  's/\( @@@ \)\{1,\}/\n/g'

//lakjsdfl@
const in dfdf;
int i
main()
// lsjdgljdfg
int x(int i)
/* alsfjdklfd*/

论坛徽章:
0
发表于 2004-10-20 09:03 |显示全部楼层

请教:sed匹配记数?比如替换C程序的一个函数体

佩服lightspeed!
sed果然博大精深,
以前研究过一遍,现在除了替换(s),删除(d)和打印(p)外,
什么都不记得了。
andywang 该用户已被删除
发表于 2004-10-20 14:18 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2004-10-20 14:36 |显示全部楼层

请教:sed匹配记数?比如替换C程序的一个函数体

sed是比较深奥.
andywang 该用户已被删除
发表于 2004-10-20 14:38 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2004-10-21 08:26 |显示全部楼层

请教: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 ,就是这种错误了.

论坛徽章:
0
发表于 2004-10-21 08:59 |显示全部楼层

请教:sed匹配记数?比如替换C程序的一个函数体

滔滔江水~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP