[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

回复 15楼 的帖子

太棒了!

只剩下一处美中不足的地方,就是输出的txt文件末尾自动添加了“\路径\txt文件名.txt”的内容,可否将这处自动添加的内容去掉?

示例原文件保存于根目录下的“新建文件夹中”,则输出结果如下:
--------------------------------------------------
发表时间:2010年
作者:批处理
点击数:1
详细说明:  在正常情况下,无线路由器和访问点都拥有防止未知的无线设备连接到网络的能力。  这种功能是通过比较试图连接到路由器的设备MAC地址和路由器所保存设备的MAC地址而实现的。  不过,不幸的是,在路由器出厂时这种特性通常是关闭的,因为这需要用户的一些努力才能使其正确工作,否则反而无法连接网络。因此,通过启用这种特性,并且只告诉路由器本单位或家庭中无线设备的MAC地址,我们就可以防止他人盗用自己的互联网连接,从而提升安全性。(文本末)\新建文件夹\原文件.txt
--------------------------------------------------

再次感谢yangfengoo老师!

TOP

  1. gawk -f comb-lst.awk urfile.txt > new.txt && type new.txt
复制代码

  1. {
  2.     if($0 ~ /详细说明/){
  3.         linenum = nr
  4.         printf("%s",$0)
  5.     }
  6.     else if(linenum){
  7.         printf("%s",$0)
  8.     }
  9.     else if(!linenum){
  10.         print $0
  11.     }
  12. }
复制代码


试试看能不能用。gawk为第三方软件,本论坛有下载。

[ 本帖最后由 asnahu 于 2010-10-1 13:32 编辑 ]

TOP

回复 14楼 的帖子

-i会直接修改原文件,哪里来的输出?

TOP

  1. @echo off
  2. for /f "tokens=1,2 delims=:" %%i in ('findstr /lin "详细说明:" "*.txt"') do (
  3. >~emp set/p=详细说明:<nul
  4. (for /f "tokens=*" %%a in ('more +%%j "%%i"') do set/p=%%a<nul)>>~emp
  5.      move ~emp "%%i"
  6. )
  7. pause
复制代码

TOP

回复 17楼 asnahu 的帖子

测试结果是,代码执行后没有对原文本文件进行处理。不知问题出在哪儿。
也用了CUer的sed命令,结果都不理想。

[ 本帖最后由 plues 于 2010-10-1 08:52 编辑 ]

TOP

回复 19楼 terse 的帖子

terse老师的代码执行后,实现了“详细说明”后面所有段落的合并,但将“详细说明”前面的文本内容全部删除了。

原题:如何将这个指定字符后面的所有段落内容合并为一段,指定字符前面的文本内容不做处理

代码很好地实现了段落合并的需要,但忽视了后面“指定字符前面的文本内容不做处理”的要求。

请terse老师再修改一下。可参考15楼yangfengoo老师的代码。

yangfengoo老师的代码,唯一不足之处就是代码执行后在原文本末自动添加了\路径名\txt文件名.txt的内容。如果能去掉这些自动添加的内容就完美了。

谢谢各位老师热心跟帖解答。

[ 本帖最后由 plues 于 2010-10-1 08:53 编辑 ]

TOP

回复 20楼 的帖子

代码生成new.txt文件,源文件没修改。另外,如果gawk、sed都不能正确执行,请说明你的系统环境。

TOP

回复 20楼 的帖子

我用的sed 4.1.4
拿你11楼的数据做测试,得到的结果给你提供的结果一样,不知道哪里不理想。

TOP

来个js
  1. folder = "C:\\test2"; //目录路径请用\\
  2. overWrite = 0; //是否替换原文件
  3. fso = new ActiveXObject("Scripting.FileSystemObject");
  4. if (!overWrite) {
  5.   if (!fso.FolderExists(folder+'\\new'))
  6.     folder2 = fso.CreateFolder(folder+'\\new').Path;
  7.   else
  8.     folder2 = folder+'\\new';
  9. } else {
  10.   folder2 = folder;
  11. }
  12. e = new Enumerator(fso.GetFolder(folder).Files);
  13. for (; !e.atEnd(); e.moveNext())
  14. {
  15.   f = e.item();
  16.   if (f.Name.slice(-3).toLowerCase()=='txt') deal( f.Name );
  17. }
  18. function deal(file)
  19. {
  20.   var s='';
  21.   s = fso.OpenTextFile(folder+'\\'+file).ReadAll();
  22.   s=s.replace(/详细说明[\s\S]*/gm, function(ss){return ss.replace(/[\r\n]/g,'');});
  23.   fso.OpenTextFile(folder2+'\\'+file,2,true).Write(s);
  24.   //return(s);
  25. }
复制代码
1

评分人数

    • zqz0012005: 可以看出很有实力PB + 10 技术 + 1

TOP

回复 23楼 CUer 的帖子

奇怪,我换了不同的系统(winxp,win2003),不同版本的Sed(4.1.14 ,4.1.5),不同的电脑,结果都是一样。

TOP

文本的断行有问题,可以试试GNU SED 4.2。文本是网页转过来的吧。

TOP

天哪,竟然成功了!

按照asnahu的提示换了sed 4.2的版本,问题圆满解决!

在此,一并致谢yangfengoo、CUer、asnahu、terse、powerbat老师的大力相助!辛苦了!

同一问题,各位老师各施武艺,用不同的思路出发,使用了批处理、sed、gawk、JS,可谓殊途同归,不得不赞叹批处理之家高手云集,向您们深深的致谢!

TOP

原帖由 plues 于 2010-10-1 08:49 发表
terse老师的代码执行后,实现了“详细说明”后面所有段落的合并,但将“详细说明”前面的文本内容全部删除了。

原题:如何将这个指定字符后面的所有段落内容合并为一段,指定字符前面的文本内容不做处理。

代码 ...
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (*.txt) do (
  3.     set "i="
  4.     (for /f "usebackq delims=" %%i in ("%%~a") do (
  5.         set str=%%i
  6.         if "!str:详细说明:=!" neq "%%i" set i=i
  7.         if defined i (set/p=%%i<nul) else echo %%i
  8.      ))> ~emp
  9.      move ~emp "%%a"
  10. )
  11. pause
复制代码

TOP

返回列表