免费注册 查看新帖 |

Chinaunix

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

[文本处理] 如何用sed/awk行首插入行号? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-29 15:05 |只看该作者 |倒序浏览
本帖最后由 kangear 于 2014-05-29 15:31 编辑

最初我的想法是这样的,把代码插入的word中,不是完整的代码。都是一些代码片段,我想把在代码前添加行号。代码片段我一般控制在1-99行。一般是这样的效果:

在原文本的地方添加 行号+" "。 行号是%2d格式的。也就是不够两位的第1位补0。请问这用sed如何实现呢?谢谢各位了。

仔细想了想应该是:sed先读取当前行的行号然后将其转换成%2d格式写入行首。

哦,不好意思我不了解awk,这个只是要效果,用什么实现都OK。

论坛徽章:
0
2 [报告]
发表于 2014-05-29 15:29 |只看该作者
有awk了,或是你可以请加好1 2 3 4然后再使用sed替换0-01
  1. [root@svn252 ~]# awk '{if(NR<=9){printf 0NR" "}else{printf NR" "}}1' /etc/passwd
  2. 01 root:x:0:0:root:/root:/bin/bash
  3. 02 bin:x:1:1:bin:/bin:/sbin/nologin
  4. 03 daemon:x:2:2:daemon:/sbin:/sbin/nologin
  5. 04 adm:x:3:4:adm:/var/adm:/sbin/nologin
  6. 05 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  7. 06 sync:x:5:0:sync:/sbin:/bin/sync
  8. 07 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  9. 08 halt:x:7:0:halt:/sbin:/sbin/halt
  10. 09 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  11. 10 news:x:9:13:news:/etc/news:
  12. 11 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
  13. 12 operator:x:11:0:operator:/root:/sbin/nologin
  14. 13 games:x:12:100:games:/usr/games:/sbin/nologin
复制代码

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-08 06:20:00数据库技术版块每日发帖之星
日期:2015-08-29 06:20:00数据库技术版块每日发帖之星
日期:2015-08-29 06:20:00数据库技术版块每日发帖之星
日期:2015-09-18 06:20:00数据库技术版块每周发帖之星
日期:2015-11-06 19:56:51数据库技术版块每日发帖之星
日期:2016-01-22 06:20:00数据库技术版块每日发帖之星
日期:2016-02-05 06:20:00
3 [报告]
发表于 2014-05-29 15:30 |只看该作者
本帖最后由 asdf2110 于 2014-05-29 15:35 编辑

用 awk 多好,必须 sed ?
  1. seq 10 | awk '{printf("%02d %s\n", NR, $0)}'
  2. 01 1
  3. 02 2
  4. 03 3
  5. 04 4
  6. 05 5
  7. 06 6
  8. 07 7
  9. 08 8
  10. 09 9
  11. 10 10
复制代码

论坛徽章:
0
4 [报告]
发表于 2014-05-29 15:32 |只看该作者
回复 3# asdf2110
哦,不好意思我不了解awk,这个只是要效果,用什么实现都OK。自己用,不是用来考试。:)

   

论坛徽章:
0
5 [报告]
发表于 2014-05-29 15:35 |只看该作者
本帖最后由 kangear 于 2014-05-29 15:38 编辑

回复 2# todayhero
十分感谢,以前搞替换都是用sed,以为sed的功能比awk强大呢,看来各有优缺点。:)
相比起来@asdf2110的似乎少了一个判断。

   

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-08 06:20:00数据库技术版块每日发帖之星
日期:2015-08-29 06:20:00数据库技术版块每日发帖之星
日期:2015-08-29 06:20:00数据库技术版块每日发帖之星
日期:2015-09-18 06:20:00数据库技术版块每周发帖之星
日期:2015-11-06 19:56:51数据库技术版块每日发帖之星
日期:2016-01-22 06:20:00数据库技术版块每日发帖之星
日期:2016-02-05 06:20:00
6 [报告]
发表于 2014-05-29 15:36 |只看该作者
  1. $ seq 10 | awk '{printf("%02d %s\n", NR, $0)}'
  2. 01 1
  3. 02 2
  4. 03 3
  5. 04 4
  6. 05 5
  7. 06 6
  8. 07 7
  9. 08 8
  10. 09 9
  11. 10 10
复制代码
回复 4# kangear


   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
7 [报告]
发表于 2014-05-29 15:37 |只看该作者
本帖最后由 jason680 于 2014-05-29 15:38 编辑

回复 4# kangear

$ seq -fxxx%g 3 | awk '{printf("%02d %s\n",NR,$0)}'
01 xxx1
02 xxx2
03 xxx3

BTW, why do you need this function?
CU have line number function in code segment ...
  1. abc
  2. 123
  3. ...
复制代码

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
8 [报告]
发表于 2014-05-29 15:39 |只看该作者
回复 1# kangear
理论上sed可以实现,但是没awk简洁。
  1. sed = test.c|sed 'N;s/\n/ /;s/^[0-9]\b/0&/'
  2. 01 int main()
  3. 02 {
  4. 03         char **p=new char*[100];
  5. 04         int ret;
  6. 05         int i;
  7. 06         for(i=0;i<sizeof(p);i++)
  8. 07         {
  9. 08            p[i]=new char[i];
  10. 09            ret =i;
  11. 10         }
  12. 11         delete []p;
  13. 12         p=NULL;
  14. 13     cout<<ret<<endl;
  15. 14         return 0;
  16. 15 }
复制代码

论坛徽章:
0
9 [报告]
发表于 2014-05-29 15:41 |只看该作者
本帖最后由 kangear 于 2014-05-29 15:46 编辑

回复 7# jason680
十分感谢回复,这样做的原因是把 代码片段+行号 写入到word中用根据行号来解释代码的意思 我觉得更清晰明朗,我看很多书都这样的方式,我也不知道他们是如何实现的,我觉得sed/awk可以搞定就来这里求教了。


   

论坛徽章:
0
10 [报告]
发表于 2014-05-29 15:49 |只看该作者
回复 8# Herowinter
您说的确实对,可以实现,但是有点没有awk简洁。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP