免费注册 查看新帖 |

Chinaunix

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

[文本处理] 请教匹配紧邻两行间插入一行且可以引用的方法? [复制链接]

论坛徽章:
0
发表于 2017-01-04 11:37 |显示全部楼层
需要在如下文本中修改:

date: 2017-1-3
update: 2017-1-3
tags: [test]

date: 2016-11-3
tags: [test]



如上,三行文本是完整的,两行是不完整的,混合在一起。需要定位date行紧邻tags行的位置(即缺少update行的地方),在两行中间插入一行update,且update后的日期为前一行date的日期。通过搜索学习,目前可以使用sed在需要的位置插入一行,但不知道如何引用到前面捕获的分组,现在使用的命令为:
sed '/^date:\s\([-0-9]*\)/{n;s/^tags:\s\(.*\)/update: \1\n&/g}'
后面的\1只能引用到tags后面的捕获分组,求教如何在{}里面引用到{}外面的捕获分组,或者有其他解决办法,谢谢各位!

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2017-01-04 11:43 |显示全部楼层

  1. sed '/date/{N;/update/!{P;s/date/update/}}
复制代码

论坛徽章:
0
发表于 2017-01-04 13:52 |显示全部楼层
回复 2# moperyblue

非常感谢!验证有效,又翻了翻资料,勉强理解这句命令了。系统性学习sed的资料感觉好少,还是要多多积累学习了。再次感谢!

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-01-04 15:25 |显示全部楼层
  1. perl -00pe 's/^(date([^\n]+\n))(?!update)/$1update$2/m' f
复制代码

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-09-07 06:20:00程序设计版块每日发帖之星
日期:2015-09-07 06:20:00
发表于 2017-01-05 09:50 |显示全部楼层
  1. [root@CentOS_6 experiment]# awk -f test.awk test.txt | sed '/tags/a \ '
  2. date: 2017-1-3
  3. update: 2017-1-3
  4. tags: [test]

  5. date: 2016-11-3
  6. update: 2016-11-3
  7. tags: [test]

  8. [root@CentOS_6 experiment]# cat test.awk
  9. BEGIN {FS="\n"; RS=""}
  10. {
  11.   if(NF==3){print}
  12.   else{split($1,array,":");print $1;printf "update:" array[2] "\n";print $2}
  13. }
  14. [root@CentOS_6 experiment]# cat test.txt
  15. date: 2017-1-3
  16. update: 2017-1-3
  17. tags: [test]

  18. date: 2016-11-3
  19. tags: [test]
  20. [root@CentOS_6 experiment]#
复制代码

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2017-01-05 10:11 |显示全部楼层

  1. awk '/date/{print;s=$0;getline;if(!/update/)print gensub(/date/,"update",1,s)}1'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP