Board logo

标题: [已解决]sed去除关键词之间的关键词 [打印本页]

作者: hlzj88    时间: 2018-12-17 17:54     标题: [已解决]sed去除关键词之间的关键词

本帖最后由 hlzj88 于 2018-12-22 21:36 编辑

如题,假设文本内容为
     罗伯特不满:“我最近运气不好,<br>也不需要你让着我。<br>我不信和你打赌<br>会一直输。”<br>陆恪当时没在意,但晚上回到房间躺下,脑中有种若有似无的灵感在飘荡着。<br>罗伯特没有回答,而是继续问道:“想要有一个更大舞台么?<br>”<br>陆恪吃惊:“啊?”

上句为人为制造,可见,有三对完整引号,如果按这样断行,不符合正常断句。因此只去除引号内的<br>,其他保留,基本符合常规断句。
谢谢!

以上是原问题,经why帮助已解决,代码在2楼。因我的sed版本问题导致不能成功,所以更新了sed。
同时发现新问题,使用sed4.4版本后,处理较多,较大文件时,这个sed相比原来的sed(版本不清楚,大小234K)在速度上变得明显慢了。为了速度,使用原来的sed后,直接出现Program too big to fit in memory错误,这个版本的sed不能使用了,经两台重装系统后都发现老sed也不能用了,错误同前。匪夷所思。
本意提醒大家注意到这样的问题,版主热情关心,建议把我的工具发到首页,忘能有大家帮助共同解决。特补充内容到三楼,期待热心人帮助。
作者: WHY    时间: 2018-12-17 19:09

本帖最后由 WHY 于 2018-12-17 21:30 编辑
  1. sed -r ":a;s/(“[^“”]*)<br>([^“”]*”)/\1\2/g;ta" 1.txt > 2.txt
复制代码

作者: hlzj88    时间: 2018-12-17 19:40

本帖最后由 hlzj88 于 2018-12-22 22:27 编辑

回复 2# WHY

这个代码是专职 从网页文件提取正文的。

1网页提取.bat  设计要使它能兼容不同网页编码,不同行长,gizp压缩网页,不同排版。使提取的网页正文尽量干净。产生是文本要通过重新排版,使内容更符合常规断句。要求能独立运行,也可被别的文件调用。

附件已上传,http://www.bathome.net/attachmen ... XhxTUo4dzd1WQ%3D%3D
作者: Batcher    时间: 2018-12-17 20:16

回复 3# hlzj88


    请在顶楼给个具体的例子吧
作者: 523066680    时间: 2018-12-17 20:22

本帖最后由 523066680 于 2018-12-17 20:23 编辑

回复 3# hlzj88

    2楼已经给出了核心思路。相信好学的人已经能够举一反三,而不是丢一句 “经测试不成功”。

加个循环的事儿~ Perl
  1. my $s='其他词“其他词<br>a<br>其他词”其他词';
  2. while ($s=~s/(“[^“”]+)<br>([^“”]+”)/$1$2/) {};
  3. print $s;
复制代码

作者: hlzj88    时间: 2018-12-17 20:45

回复 4# Batcher
已重新举例。
回复 5# 523066680
你说的是,对正则表达一头雾水,sed使用也浅。好吧,不给自己找理由。也谢谢你。
作者: WHY    时间: 2018-12-17 21:32

回复 3# hlzj88


    已修改
作者: hlzj88    时间: 2018-12-17 21:41

回复 7# WHY

应Batcher版主提议,已修改一楼的例句,可能能代表更实际的复杂情况。你的代码测试可去掉 舞台 那句里的,第一句反复执行无变化。
谢谢。麻烦你再看看。
作者: WHY    时间: 2018-12-17 21:56

回复 8# hlzj88


   
Microsoft Windows [版本 10.0.17763.168]
(c) 2018 Microsoft Corporation。保留所有权利。

C:\Users\WHY>cd /d E:\Test

E:\Test>type 1.txt
如题,假设文本内容为
     罗伯特不满:“我最近运气不好,<br>也不需要你让着我。<br>我不信和你打赌<br>会一直输。”<br>陆恪当时没在意,但晚上回 到房间躺下,脑中有种若有似无的灵感在飘荡着。<br>罗伯特没有回答,而是继续问道:“想要有一个更大舞台么?<br>”<br>陆恪吃惊:“啊?”

E:\Test>sed -r ":a;s/(“[^“”]*)<br>([^“”]*”)/\1\2/g;ta" 1.txt > 2.txt

E:\Test>type 2.txt
如题,假设文本内容为
     罗伯特不满:“我最近运气不好,也不需要你让着我。我不信和你打赌会一直输。”<br>陆恪当时没在意,但晚上回到房间躺下, 脑中有种若有似无的灵感在飘荡着。<br>罗伯特没有回答,而是继续问道:“想要有一个更大舞台么?”<br>陆恪吃惊:“啊?”

E:\Test>

作者: hlzj88    时间: 2018-12-17 22:44

回复 9# WHY
非常感谢你,通过比较和怀疑,重新下载了sed 4.4版本,二楼代码一次成功。原来是我的sed有不足。系统win7
作者: hlzj88    时间: 2018-12-20 21:20

补充,sed4.4的处理速度不敢恭维,整体慢了很多。    想放弃,但是替换回原sed后,运行出错,大意是文件太大不能载入吧。重装两台电脑也是同样问题。
理论上应该是不可能的问题,毕竟发生了。不想这样来联系问题,但的确是几乎没有做其他事情就这样了。
有看到的,可以参考为戒。
作者: tigerpower    时间: 2018-12-21 14:08

本帖最后由 tigerpower 于 2018-12-25 18:01 编辑

回复 11# hlzj88

下载 sed 4.5
作者: Batcher    时间: 2018-12-21 14:16

回复 11# hlzj88


    需要处理一个很大的文件(大概多少行,文件大小多少M)?还是很多个小文件(大概多少文件)?
作者: hlzj88    时间: 2018-12-21 22:24

回复 13# Batcher

先谢谢12楼tigerpower

回版主:网络小说下载合并处理,因sed的替换等很方便,且有回车效果,处理很方便,所以使用sed。文件不大,十几K的小文件,为提速,避免多个文件单独处理需多次启动sed和其他命令,采取n合1方式,加限制,每个合并后文件不大于2.5M。替换后sed后运行发现整体速度明显下降。于是打算重新用原来版本的sed,出现Program too big to fit in memory提示,已不能处理文件。对于十几K的小文件,sed也会出现这提示,已不能处理文件。百度无解,用新sed可工作就是慢的着急。刚好也打算重做系统,一并解决。但重装后使用老sed,发现已不能如前顺利处理。怀疑在单位重复上面的经过,同样结果。不明原因。也无力深究。
作者: Batcher    时间: 2018-12-21 22:34

回复 14# hlzj88


    sed 4.4 处理2.5M文件大概几分钟?12楼说的sed 4.5速度如何?完整bat代码发出来看看是否可以进一步优化。
作者: hlzj88    时间: 2018-12-21 23:17

回复 15# Batcher

组件形式,单独上传了提取网页的bat
作者: Batcher    时间: 2018-12-22 10:25

回复 16# hlzj88


    建议把最新情况和代码都更新到顶楼吧,否则好多人可能看不到
作者: WHY    时间: 2018-12-22 23:52

如果文件数量多的话,建议用 sed 批量替换,而不是每个文件调用多次 sed 命令。
如:sed -i "s/[A-Z]/\l&/g;s/<br \/>/<br>/g" *.txt
可以减少 sed 调用次数,提高点效率。htox32c 应该也支持批量转换。
作者: tigerpower    时间: 2018-12-23 10:02

回复 14# hlzj88

你觉得原来的sed快可以继续用原来的,把二楼那句用mawk替换掉
  1. mawk "{while($0){match($0,/“/);s=RSTART;if(!s){printf $0;break}printf substr($0,1,s-1);match($0,/”/);e=RSTART+RLENGTH;t=substr($0,s,e-s+1);gsub(/<br>/,\"\",t);printf t;$0=substr($0,e+1)}print \"\"}" 1.txt > 2.txt
复制代码

作者: hlzj88    时间: 2018-12-24 20:58

本帖最后由 hlzj88 于 2018-12-24 21:25 编辑

回复 18# WHY
回复 19# tigerpower
谢谢,谢谢。
@why:实践表明,sed几个替换同一语句的用法,最稳妥的是一次4个连用,多了也会错的,也许这也是和版本有关系,不清楚了。
作者: Batcher    时间: 2018-12-24 23:42

回复 20# hlzj88


    每个替换前面加个 -e 能否超过4个呢
作者: hlzj88    时间: 2018-12-26 22:31

回复 21# Batcher
谢谢指导,尝试加 -e 可以多个替换一次处理

另,通过每句命令加暂停,观察到 sed ":a;N;s/\n//;ba;" 1.txt>2.txt 当文件较大时,极度耗时间。已另思路解决。几秒。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2