免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4104 | 回复: 17
打印 上一主题 下一主题

[文本处理] 如何给printf之前和之后加上合适的一行 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-09 10:04 |只看该作者 |倒序浏览
本帖最后由 l2002924700 于 2014-08-09 19:57 编辑

现在有这样一篇文件,就是该文件内有若干个printf,其中每个printf前面有若干个制表符,我们需要在printf之前一行加上#ifdef XXX,在printf之后一行,加上#endif,同时这若干个printf中有几行是连续的有printf,即:
printf();
printf();
........
printf();
这种情况是只在第一个printf之前加上#ifdef XXX,在最后一行之后加上#endif
那么我现在有一个问题,就是如何针对printf做处理呢?printf之前有若干个制表符,之后又有(,请教方家,这个脚本该怎么写呢?
再追加一个问题,就是如何在一个脚本中,即使用sed命令,又使用awk命令呢?这两个命令的解释器不一样

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
2 [报告]
发表于 2014-08-09 10:22 |只看该作者
把你的正常情况、特殊情况,一个不漏的列举出来,最后将你想要的结果贴出来,比你说一大堆更有用!

论坛徽章:
8
戌狗
日期:2013-10-12 11:37:19双子座
日期:2014-05-06 14:40:39巨蟹座
日期:2014-06-14 09:22:18戌狗
日期:2014-09-18 16:05:44巨蟹座
日期:2014-12-27 16:37:26酉鸡
日期:2015-01-20 18:39:022015年亚洲杯之沙特阿拉伯
日期:2015-04-20 22:38:242015亚冠之萨济拖拉机
日期:2015-06-19 16:01:03
3 [报告]
发表于 2014-08-09 10:58 |只看该作者
源文件---目标文件

论坛徽章:
0
4 [报告]
发表于 2014-08-09 18:25 |只看该作者
我有个笨的办法,先把所有的printf前后都加上ifdef和endif,然后再出去所有重复的,重复的一定是连续的如下
#endif
#ifdef XXX

sed '/printf\(\)/ i\#ifdef XXX' r3.txt |sed '/printf\(\)/ a\#endif' |sed '/#endif/N;/#endif\n#ifdef XXX/d'




[root@symc1 scripts]# cat r3.txt
1

printf();


printf();
printf();
........
printf();



printf();
printf();
printf();


printf();


[root@symc1 scripts]# sed '/printf\(\)/ i\#ifdef XXX' r3.txt |sed '/printf\(\)/ a\#endif' |sed '/#endif/N;/#endif\n#ifdef XXX/d'
1

#ifdef XXX
printf();
#endif


#ifdef XXX
printf();
printf();
#endif
........
#ifdef XXX
printf();
#endif



#ifdef XXX
printf();
printf();
printf();
#endif


#ifdef XXX
printf();
#endif

论坛徽章:
0
5 [报告]
发表于 2014-08-09 19:56 |只看该作者
sed '/#endif/N后面的/N该怎么理解啊?

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
6 [报告]
发表于 2014-08-09 20:18 |只看该作者
回复 5# l2002924700


    append the next line of input into the pattern space.

论坛徽章:
0
7 [报告]
发表于 2014-08-09 20:20 |只看该作者
本帖最后由 l2002924700 于 2014-08-09 20:43 编辑

回复 2# yestreenstars
这位仁兄指教的是:
正常情况就是:
有一行printf(“”);
要在它的前面和后面分别加上#ifdef XXXX和#endif。
特殊情况就是有多行的printf(“”);,只是在第一个printf的上一行加上#ifdef xxx和最后一行之后的一行加上#endif。
我写的脚本是这样的:
#/bin/awk -f
BEGIN {FS = "(";}//以(作为列分隔符, 这样可以将printf以及之前的若干个空白符作为第一个域


sub/^\/\/[ |\t]*printf/printf/;  //删除printf之前多于的空白字符

if(($1 == "printf") && (x != "printf")) {//如果当前行是printf并且上一行不是printf,那么就在当前行的上一行加上#ifdef XXXX
        print "#ifdef  xxxx";
        print $0;
} else if(($1 != "printf")&&(x == printf)) {//如果当前行不是printf并且上一行是printf,那么就在当前行的下一行加上#endif
        printf $0;
        print “#endif”;
} else {
        print $0;
}

x = $1;
之所以要把printf之前的空白字符去掉,就是因为我找不到能够和前面有若干个空白字符的一行精确相等的办法。
小弟是初学,还望各位方家指正。

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
8 [报告]
发表于 2014-08-09 20:41 |只看该作者
本帖最后由 欧阳西风 于 2014-08-09 20:41 编辑

回复 7# l2002924700


    你判断这一行是否包含printf,没必要使$1完全等于printf吧,只要判断
  1. $0 ~ /printf/
复制代码
不就行了嘛?

另外 你的x没有赋值,你这个脚本能够成功运行?

论坛徽章:
0
9 [报告]
发表于 2014-08-09 20:44 |只看该作者
谢谢,改了。能不能解释一下你这条指令的含义啊,特别是波浪符~在这的作用。

论坛徽章:
3
天蝎座
日期:2013-12-10 19:37:11酉鸡
日期:2014-08-04 20:05:38双鱼座
日期:2014-08-09 21:53:54
10 [报告]
发表于 2014-08-09 20:48 |只看该作者
回复 9# l2002924700


    这个就是正则 “匹配” 了,也即$0 匹配 printf(这里的正则表达式恰好也是一个字符串)。

根据你的思路,没必要设置分隔符来取$1,只需要使用$0,并用x来保存$0,仍然是判断匹配即可。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP