免费注册 查看新帖 |

Chinaunix

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

[文本处理] sed语法疑问指定行前面插入另外一个文本 [复制链接]

论坛徽章:
6
15-16赛季CBA联赛之浙江
日期:2021-07-14 11:18:4315-16赛季CBA联赛之浙江
日期:2021-08-20 17:26:1015-16赛季CBA联赛之天津
日期:2021-09-01 10:56:4619周年集字徽章-19
日期:2021-10-12 11:08:032016科比退役纪念章
日期:2021-10-12 11:33:4515-16赛季CBA联赛之深圳
日期:2021-11-11 14:25:38
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2021-12-22 11:42 |只看该作者 |倒序浏览
http://bbs.chinaunix.net/thread-4316920-1-2.html
看到这个帖子的问题,于是百度了一下sed 如何实现,找到如下语法
sed '/\/head/{r read.txt
;N}' filename
这样就实现了将内容插入到匹配行前面,但是我想不通其中的原理,有没有大神解释下

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-10-11 06:20:0015-16赛季CBA联赛之山东
日期:2016-05-28 18:18:5615-16赛季CBA联赛之新疆
日期:2017-04-12 22:55:4715-16赛季CBA联赛之青岛
日期:2017-06-26 18:30:0315-16赛季CBA联赛之四川
日期:2017-09-04 12:27:0315-16赛季CBA联赛之福建
日期:2018-02-09 14:28:3315-16赛季CBA联赛之同曦
日期:2018-04-17 12:43:3415-16赛季CBA联赛之浙江
日期:2018-07-14 13:27:4015-16赛季CBA联赛之吉林
日期:2018-09-13 15:48:2915-16赛季CBA联赛之新疆
日期:2016-05-07 05:05:3215-16赛季CBA联赛之八一
日期:2016-03-14 12:32:06程序设计版块每日发帖之星
日期:2015-12-12 06:20:00
2 [报告]
发表于 2021-12-23 11:17 |只看该作者
开启 sed debug 模式 看一看
  1. [root@test-02 ~]# cat a
  2. aaaaaa
  3. [root@test-02 ~]# seq 5 | sed4.8 '/3/{r a
  4. > N}'
  5. 1
  6. 2
  7. aaaaaa
  8. 3
  9. 4
  10. 5
  11. [root@test-02 ~]# seq 5 | sed4.8 --debug '/3/{r a
  12. N}'
  13. SED PROGRAM:
  14.   /3/ {
  15.     r a
  16.     N
  17.   }
  18. INPUT:   'STDIN' line 1
  19. PATTERN: 1
  20. COMMAND: /3/ {
  21. COMMAND: }
  22. END-OF-CYCLE:
  23. 1
  24. INPUT:   'STDIN' line 2
  25. PATTERN: 2
  26. COMMAND: /3/ {
  27. COMMAND: }
  28. END-OF-CYCLE:
  29. 2
  30. INPUT:   'STDIN' line 3
  31. PATTERN: 3
  32. COMMAND: /3/ {
  33. COMMAND:   r a
  34. COMMAND:   N
  35. aaaaaa
  36. PATTERN: 3\n4
  37. COMMAND: }
  38. END-OF-CYCLE:
  39. 3
  40. 4
  41. INPUT:   'STDIN' line 5
  42. PATTERN: 5
  43. COMMAND: /3/ {
  44. COMMAND: }
  45. END-OF-CYCLE:
  46. 5
  47. [root@test-02 ~]# seq 5 | sed4.8 -e '/3/{r a' -e 'N}'
  48. 1
  49. 2
  50. aaaaaa
  51. 3
  52. 4
  53. 5
  54. [root@test-02 ~]# seq 5 | sed4.8 --debug -e '/3/{r a' -e 'N}'
  55. SED PROGRAM:
  56.   /3/ {
  57.     r a
  58.     N
  59.   }
  60. INPUT:   'STDIN' line 1
  61. PATTERN: 1
  62. COMMAND: /3/ {
  63. COMMAND: }
  64. END-OF-CYCLE:
  65. 1
  66. INPUT:   'STDIN' line 2
  67. PATTERN: 2
  68. COMMAND: /3/ {
  69. COMMAND: }
  70. END-OF-CYCLE:
  71. 2
  72. INPUT:   'STDIN' line 3
  73. PATTERN: 3
  74. COMMAND: /3/ {
  75. COMMAND:   r a
  76. COMMAND:   N
  77. aaaaaa
  78. PATTERN: 3\n4
  79. COMMAND: }
  80. END-OF-CYCLE:
  81. 3
  82. 4
  83. INPUT:   'STDIN' line 5
  84. PATTERN: 5
  85. COMMAND: /3/ {
  86. COMMAND: }
  87. END-OF-CYCLE:
  88. 5
复制代码

论坛徽章:
6
15-16赛季CBA联赛之浙江
日期:2021-07-14 11:18:4315-16赛季CBA联赛之浙江
日期:2021-08-20 17:26:1015-16赛季CBA联赛之天津
日期:2021-09-01 10:56:4619周年集字徽章-19
日期:2021-10-12 11:08:032016科比退役纪念章
日期:2021-10-12 11:33:4515-16赛季CBA联赛之深圳
日期:2021-11-11 14:25:38
3 [报告]
发表于 2021-12-23 14:00 |只看该作者
本帖最后由 a5love3n 于 2021-12-23 14:04 编辑

回复 2# baby_神

感谢大神指导,我的sed 4.2好像没有debug,用sedsed看了下执行过程
  1. sedsed -d -e '/3/{r test.txt' -e 'N}' test1.txt   \\这条命令会把结果插入到指定行前面
  2. ......
  3. PATT:3$
  4. HOLD:$
  5. COMM:/3/ {
  6. COMM:r test.txt
  7. PATT:3$
  8. HOLD:$
  9. COMM:N
  10. a1   abcd   a2    cdef
  11. a3   ghij    a4    klmn

  12. a1   aaaa   a2   bbbb
  13. a3   ccccc  a4   ddddd
  14. a5   eeee   a6   ffffff

  15. a1   yyyy     a2   zzzzz
  16. a3   wwww  a4   xxxx
  17. PATT:3\n4$
  18. HOLD:$
  19. COMM:}
  20. PATT:3\n4$
  21. HOLD:$
  22. 3
  23. 4
  24. ......
复制代码
  1. sedsed -d  '/3/r test.txt' test1.txt  \\这条命令会把内容插入到指定行后面
  2. ......
  3. PATT:3$
  4. HOLD:$
  5. COMM:/3/ r test.txt
  6. PATT:3$
  7. HOLD:$
  8. 3
  9. a1   abcd   a2    cdef
  10. a3   ghij    a4    klmn

  11. a1   aaaa   a2   bbbb
  12. a3   ccccc  a4   ddddd
  13. a5   eeee   a6   ffffff

  14. a1   yyyy     a2   zzzzz
  15. a3   wwww  a4   xxxx
  16. PATT:4$
  17. HOLD:$
  18. COMM:/3/ r test.txt
  19. PATT:4$
  20. HOLD:$
  21. 4
  22. ......
复制代码
从执行过程对比来看,我的理解是:当 r 命令后面有N命令的时候,sed会把r 命令的内容输出,再去执行默认动作(打印pattern space里面的内容),后面没有N命令的时候,会先执行默认动作(打印pattern space里面的内容),最后再输出 r 命令读取到的文件内容,不知我理解的对不对
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP