免费注册 查看新帖 |

Chinaunix

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

[文本处理] sed删除两节之间的内容,两节的关键字部分相同 [复制链接]

论坛徽章:
0
发表于 2022-09-28 10:38 |显示全部楼层
sed删除两节之间的内容,两节的关键字部分相同
原文件:
title a1
1
2
title a1-2
3
4
5
6
title b
7
8
9
我想删除title a1到下一个title之间的部分,再删除title a1-2到下一个title之间的部分,删除第一个section1所在行,保留section2所在行,最终目的:
title b
7
8
9


请问下如何实现?
我看过类似的帖子:http://t.zoukankan.com/liuzhaoyzz-p-15605955.html
sed -i '/\[section1\]/,/\[section2\]/{/\[section1\]/!{/\[section2\]/!d}}' test.txt
有所区别的是,我的案例中,想删除第一个section1所在行,保留section2所在行,section1与section2关键字部分又相同,这个怎么实现?
sed -i -e "/title a1/,/title/{/title/^!d}" test.txt
用上面的命令,结果是这样子的:
title a1
title a1-2
3
4
5
6
title b
7
8
9

title b不能用作搜索关键字,就是说title a1-2之后的title,可能是title b,title c,......或者其他的,是未知的,只有title关键字是已知的。

我的需求是已知title a1这个关键字,删除所有的title a1关键字到下一个title之间的行,包括title a1行和title a1-2行,但不包括下一个title行,下一个title行,可能是title b,title c,......或者其他的。
请问下该怎么实现?


论坛徽章:
0
发表于 2022-09-28 13:52 |显示全部楼层
http://bbs.chinaunix.net/forum.p ... BE%B3%FD&page=1
好像跟这个有点类似,我不知道怎么改代码。

论坛徽章:
0
发表于 2022-09-28 14:28 来自手机 |显示全部楼层
本帖最后由 liuzhaoyzz 于 2022-09-29 11:11 编辑

sed如何删除特定段落? - 第2页 - Shell-Chinaunix http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4250777&extra=&highlight=sed%2B%C9%BE%B3%FD&page=2  看了这个帖子,可以用下面的代码实现了:
sed -e "/title a1/{:a;$^!N;/\ntitle/^!{s/\n\(.*\)//;ta};/title/^!P;D}" -i test.txt

论坛徽章:
0
发表于 2022-09-28 14:29 来自手机 |显示全部楼层
上面的代码是在windows下运行的。

论坛徽章:
0
发表于 2022-09-29 13:52 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2022-09-29 18:14 |显示全部楼层
回复 5# 本友会机友会摄友会

感谢回复!

我不想用powershell,因为它要求win7以上的系统,不能通杀所有系统,而且我的电脑早已精简了powershell,所以也没办法测试了。
我喜欢原生的c/c++小程序来实现的方法,比如sed/awk/grep之类的。



论坛徽章:
0
发表于 2022-09-29 21:21 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2022-09-29 21:59 |显示全部楼层
3 上述说了是win,而win上是不自带sed的。

不是有sed for windows吗?我用了很久了啊。只有233kb。


论坛徽章:
1
19周年集字徽章-年
日期:2020-10-29 09:39:21
发表于 2022-09-30 09:04 |显示全部楼层
楼主没有交待更多的条件,例如:是否是海量文件中的一部分,还有哪些干扰sections等等,所以我只针对楼主给的“原文”。
这个需求其实grep和Perl都很容易实现,既然你是精简派,你Win下应该是没装Perl,所以只给你个grep方法,Win下有grep,但我没用过,不保证是否跟GNU grep一致:
  1. grep -Poz 'title (a1)[\s\S]+?(?=title (?!\1))\K[\s\S]+' file
复制代码


  1. grep -Poz '(?s)title (a1).+?(?=title (?!\1))\K.+ file
复制代码

论坛徽章:
0
发表于 2022-10-01 07:35 |显示全部楼层
grep好麻烦,需要一堆依赖dll
libiconv2.dll
libintl3.dll
pcre3.dll
regex2.dll


我在windows下面运行你提供的代码,在windows下面我把单引号改成了双引号,在感叹号之前加了逃脱字符^:
grep -Poz "title (a1)[\s\S]+?(?=title (?^!\1))\K[\s\S]+" test.txt
grep -Poz "(?s)title (a1).+?(?=title (?^!\1))\K.+" test.txt

结果是:grep: The -P and -z options cannot be combined,这是怎么回事?

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP