免费注册 查看新帖 |

ChinaUnix.net

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

[文本处理] sed多行模式的问题 [复制链接]

论坛徽章:
0
发表于 2016-01-22 17:00 |显示全部楼层
待处理文件如下:
##begin
haha
sorry
##end
jeep
something

我想在实现打印出##begin    ##end里面的内容,删除这个区域的内容,在这个区域删除内容。嗯,我已经分别用c和bash实现了这个功能,后来想到sed有多行处理的功能,就试了下

多行打印好像是正确的:
/##begin/{
: loop
n
/##end/ b out
p
b loop
: out
}
sed -n -f  sed.conf   ./test.file

删除多行我醉了,直接删成空文件了
/##begin/{
: loop
n
/##end/ b out
d
b loop
: out
}

sed -n -f  sed.conf   -i  ./test.file

多行插入还没有实验,求解。


问些比较弱的问题:
1 n表示读入下一行覆盖模式空间吧?另外模式空间的内容给下一个命令用
2 D      Delete  up  to the first embedded newline in the pattern space.这个表示删模式空间第一行吧?  up  to是这个意思吧?
3  hold空间有啥用啊?

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
发表于 2016-01-22 17:16 |显示全部楼层
  1. sed -n '/begin/,/end/!p'
复制代码
  1. sed '/begin/{:a;N;/end/!ba;d}'
复制代码

论坛徽章:
0
发表于 2016-01-25 13:46 |显示全部楼层
本帖最后由 linkejin 于 2016-01-25 13:47 编辑

回复 2# haooooaaa
受教了,我一直在想反向匹配的问题,原来在指令前面加!就行了,我之前一直在匹配部分加!发现不行

不过还有一个问题,d      Delete pattern space.  Start next cycle.
比如sed '/begin/{:a;n;/end/{p;!ba};d}'  ./testfile   d了之后是跳到:a呢,还是/begin/那,我感觉是到a标记那边。还有一个问题,怎么跳出循环呢,我理解匹配了end之后还是会执行d的,那不是无线循环了

所以我写成了这样
/##begin/{
: loop
n
/##end/{
p
b out
}
d
}
: out


嗯,我begin和end是要打出来的,就是中间内容不打出来,所以写成这样。
   

论坛徽章:
12
程序设计版块每日发帖之星
日期:2016-01-28 06:20:00程序设计版块每周发帖之星
日期:2016-03-07 16:29:28程序设计版块每日发帖之星
日期:2016-02-04 06:20:00程序设计版块每日发帖之星
日期:2016-02-02 06:20:00每周论坛发贴之星
日期:2016-01-31 22:22:00程序设计版块每日发帖之星
日期:2016-02-01 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00每日论坛发贴之星
日期:2016-01-30 06:20:00程序设计版块每日发帖之星
日期:2016-01-30 06:20:00每日论坛发贴之星
日期:2016-01-29 06:20:00程序设计版块每日发帖之星
日期:2016-01-29 06:20:0015-16赛季CBA联赛之福建
日期:2016-04-06 14:19:05
发表于 2016-01-25 15:59 |显示全部楼层
额  为什么不写成这样   
$ sed -n '/begin/,/end/p' xxx.txt
##begin
haha
sorry
##end
或者
$ awk '/##begin/,/##end/' xxx.txt
##begin
haha
sorry
##end
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

基于案例的 SQL 优化实战训练营

讲师:中电福富特级专家梁敬彬,参与本次课程培训,你将收获:
1. 能编写出较为高效的 SQL;
2. 能解决70%以上的数据库常见优化问题;
3. 能得到老师提供的高效的相关工具和解决方案;
4. 能举一反三,收获不仅仅是 SQL 优化。
现在购票享受8.8折优惠!
----------------------------------------
优惠时间:2019年3月20日前

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP