免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2593 | 回复: 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 |显示全部楼层
  1. $fpi = "${PSScriptRoot}/20220928in.txt"
  2. $fpo = "${PSScriptRoot}/20220928out.txt"

  3. $str = Get-Content -Raw -LiteralPath $fpi #返回字符串

  4. $jg = 'title' + (($str -split 'title a1')[-1] -split 'title')[1]

  5. Set-Content -LiteralPath $fpo -Value $jg
复制代码


win,linux通用的powershell代码。

讲解:
这道题可以用上述2次分割来解决。
也可以用2次grep查找【行】,来解决。
1查找title a1所在的行。
2在这行后,查找title所在的行。

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

感谢回复!

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



论坛徽章:
0
发表于 2022-09-29 21:21 |显示全部楼层
嗯,
1 shell板块一般是,多种shell百家争鸣的。因为有多种系统,每种自带shell不同。
或许还有一种情况,有些shell做某些事简单。还有就是每人会的也不同,互相交流。
2 我这贴突出教学目的。你不看,别人看,你也可以从中学解题思路,不要那么狭隘。
世道艰难,乐于快速助人的人,应该是少了。
最爱帮你的人,是我,是我,还是我,你怎么舍得让我难过?

3 上述说了是win,而win上是不自带sed的。
4 另外,我更正下你对win版powershell版本,关于版本的谬误。

powershell 支 持 的 操 作 系 统:                                       
winxp(2.0)        win7        win8.1        win10        win11       
win2003(2.0)        win2008r2        win2012r2        win2016        win2019        win2022
win7,win2008自带 2.0,可以安装5.1,可以安装ps v7.3

alpine        Arch Linux        Kali Linux        amazon linux2        fedora30+        不支持 centos6
centos7        centos8        RockyLinux8        AlmaLinux8        oracle linux8       
ubuntu14.04-ubuntu22.04        debian8-debian11        suse-opensuse        微软CBL-Mariner 1.0-2.0               
统信UOS服务器版2020                powershell群183173532出品                       
arm64服务器cpu,安卓手机和平板                osx苹果        linux树莓派        win10-iot       
Alibaba Cloud Linux2,3        麒麟v10高级服务器        华为openEuler20.03-22.03                阿里云“龙蜥”Anolis OS 8       
5 powershell语法比python简单。对象,库,功能强大。
隐藏的限制,坑,比老脚本语言少。
语法一致性,比用多种语言合作要好。多种语言,要学多种if。借助win7,win10,月活装机量超10亿。

论坛徽章:
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