找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 71221|回复: 26

[文本处理] 批处理如何删除含A内容以上文本、及含B内容以下文本,保留中间的文本?

[复制链接]
发表于 2023-8-5 00:54:42 | 显示全部楼层 |阅读模式
本帖最后由 kidzgy 于 2023-8-5 21:03 编辑
  1. [删除的内容]
  2. [删除的内容]
  3. [删除的内容]
  4. Array.prototype.p = Array.prototype.push;   [本行也删除]

  5. [保留的内容]
  6. [保留的内容]
  7. [保留的内容]
  8. [保留的内容]
  9. [保留的内容]

  10. delete(Array.prototype.p);     [本行也删除]
  11. [删除的内容]
  12. [删除的内容]
  13. [删除的内容]
复制代码
须注意:【Array.prototype.p = Array.prototype.push; 】 【delete(Array.prototype.p); 】内容在全文搜索均仅有一个结果,如何删除【Array.prototype.p = Array.prototype.push; 】本行内容及以上的所有文本、【delete(Array.prototype.p); 】本行内容及以下的文本?且最终的效果是保留内容上下无空白行?

预期效果如下:
  1. [保留的内容]
  2. [保留的内容]
  3. [保留的内容]
  4. [保留的内容]
  5. [保留的内容]
复制代码
测试文件:
由于压缩包超过50KB,无法上传至此,故用外链。测试文件系由Snap2HTML生成的html文件。
https://wwi.lanzoup.com/iUDU114kcw4j


我刚刚灵光一闪,换了个思路,发现【findstr /i "D.p([" %1 > "temp.html"】这样的方法即可提取出所需的内容。
由于生成多个的html是可以拼接的,还是很好奇,如何运用开始的思路来分离文本?
发表于 2023-8-5 01:31:53 | 显示全部楼层
  1. @echo off
  2. rem 注意将代码中的两处字符串替换为文本中的整行,包含行首、尾空格(如有)。
  3. (for /f "useback delims=" %%a in ("1.txt") do (
  4.         if "%%a" equ "delete(Array.prototype.p);" (
  5.                 goto :next
  6.         )
  7.         if defined n (
  8.                 echo %%a
  9.         )
  10.         if "%%a" equ "Array.prototype.p = Array.prototype.push;" (
  11.                 set n=1
  12.         )
  13. ))>"2.txt"
  14. :next
  15. pause
复制代码
发表于 2023-8-5 09:24:47 | 显示全部楼层
回复 1# kidzgy
可试一下第3方工具sed ( http://bcn.bathome.net/tool/4.9/sed.exe )

  1. sed -n -r "/^Array\.prototype\.p = Array\.prototype\.push\;/,/^delete\(Array\.prototype\.p\)\;/{/^$/d;/^Array\.prototype\.p = Array\.prototype\.push\;/d;/^delete\(Array\.prototype\.p\)\;/d;p}" a.txt>b.txt
复制代码
发表于 2023-8-5 09:56:48 | 显示全部楼层
sed删除1到Array那一行,再删除delete到最后一行,也许可以
  1. sed '1,/^Array/d;/^delete/,$d' a.txt
复制代码
 楼主| 发表于 2023-8-5 13:53:59 | 显示全部楼层
77七 发表于 2023-8-5 01:31



   
回复  kidzgy
可试一下第3方工具sed (  )
hfxiang 发表于 2023-8-5 09:24



  两个输出都是空白文件
发表于 2023-8-5 14:24:22 | 显示全部楼层
回复 5# kidzgy


   参考2楼代码第2行。
发表于 2023-8-5 14:36:00 | 显示全部楼层
本帖最后由 Five66 于 2023-8-6 03:42 编辑

input.txt是输入文件名
output.txt是输出文件名
编码ascii

  1. @if (0)//==(0)// echo off&pause&cscript //nologo -e:jscript "%~f0"&pause&exit
  2. @end

  3. var inf,otf,sstr,estr,s,bbb;

  4. inf="input.txt";
  5. otf="output.txt";

  6. sstr="Array.prototype.p = Array.prototype.push;";
  7. estr="delete(Array.prototype.p);";

  8. var fso=new ActiveXObject('scripting.filesystemobject');
  9. inf=fso.OpenTextFile(inf,1,false);
  10. otf=fso.OpenTextFile(otf,2,true);

  11. s='';bbb=0;

  12. while(!inf.AtEndOfStream){
  13. s=inf.ReadLine();
  14. if(s==estr){break;}
  15. if(bbb && s){otf.WriteLine(s);s='';}
  16. if(s==sstr){bbb=1;}
  17. }

  18. inf.Close();otf.Close();fso=null;

复制代码
发表于 2023-8-5 16:49:47 | 显示全部楼层

用sed.exe(本坛第三方下载)确实比用纯P轻爽 》先粗洗一遍源文,再掐头去尾...

  1. @echo off
  2. set "p1=^Array.prototype.p = Array.prototype.push;$"
  3. set "p2=^delete(Array.prototype.p);"
  4. sed -n "/%p1%/, /%p2%/p" "源文件" | sed -e "/^$/d" -e "$d" -e "1d"
复制代码
发表于 2023-8-5 18:42:19 | 显示全部楼层

再给一个尽量简化的纯P版本,与近来数帖 '在界定行之间提取目标数据' 的题型均属同一套路...

  1. @echo off
  2. set "p1=Array.prototype.p = Array.prototype.push;"
  3. set "p2=delete(Array.prototype.p);"
  4. set "got="
  5. for /f "delims=" %%s in (源文件) do (
  6.         if /i "%%s"=="%p1%" (set "got=1") else if defined got (
  7.                 if /i "%%s"=="%p2%" (exit/b) else (echo,%%s)
  8.         )
  9. )
复制代码
发表于 2023-8-5 20:47:12 | 显示全部楼层
回复 1# kidzgy


    请把文件上传到网盘以便测试代码
 楼主| 发表于 2023-8-5 21:00:15 | 显示全部楼层
回复 7# Five66


   

提示D:\Personal\Desktop\123.bat(19, 5) Microsoft JScript 运行时错误: 输入超出了文件尾


现在已在楼主层附上测试文件。
发表于 2023-8-5 21:16:15 | 显示全部楼层

  1. 'vbs
  2. set fso=createobject("scripting.filesystemobject")
  3. set r=new regexp
  4. sstr="Array.prototype.p = Array.prototype.push;"
  5. estr="delete(Array.prototype.p);"
  6. inf="input.txt";
  7. otf="output.txt";
  8. inf=fso.OpenTextFile(inf,1,false)
  9. otf=fso.OpenTextFile(otf,2,true)
  10. r.pattern=sstr&"(.*)"&estr
  11. r.multiline=true
  12. otf.write r.execute(inf.readall)(0).submatches(0)
复制代码
或许可以吧
发表于 2023-8-5 23:17:19 | 显示全部楼层
test.html
  1.                 var D = dirs;
  2.                 Array.prototype.p = Array.prototype.push;

  3. D.p(["D:/quest2*0*1680711711*D:/quest2/","CastReceiver_1.5.6_armeabi-v7a_by_Prosmart.by.apk*12505115*1618494146","SKYBOX v1.1.0.465.apk*140533455*1680486331","SKYBOX VR Video Player [1.1.0.525].apk*121507878*1647912077","ssrray-release-3.8.10.1.apk*36174974*1621004286",310721422,"1"])
  4. D.p(["D:/quest2/adb*0*1633840967","aapt.exe*1639424*1619405894","aapt_20210426105805.exe*1639424*1619405894","adb.exe*1974272*1619405894","adb_20210426105805.exe*1974272*1619405895","AdbWinApi.dll*97792*1619405894","AdbWinApi_20210426105805.dll*97792*1619405894","AdbWinUsbApi.dll*62976*1619405894","AdbWinUsbApi_20210426105808.dll*62976*1619405895",7548928,""])



  5.                 delete(Array.prototype.p);        // remove alias added above

  6.                 $(document).ready(function(){
复制代码


code2
  1. @echo off
  2. chcp 65001 >nul
  3. rem 批处理保存为utf-8编码格式
  4. set "str1=Array.prototype.p = Array.prototype.push;"
  5. set "str2=delete(Array.prototype.p);"
  6. for /f "tokens=1 delims=:" %%a in ('^<"test.html" findstr /n /c:"%str1%" /c:"%str2%"') do (
  7.         if not defined s (
  8.                 set s=%%a
  9.         ) else (
  10.                 set e=%%a
  11.         )
  12. )
  13. (for /f "tokens=1* delims=:" %%a in ('^<"test.html" findstr /n .') do (
  14.         if %%a gtr %s% if %%a lss %e% (
  15.                 echo=%%b
  16.         )
  17. ))>"out.html"
复制代码
 楼主| 发表于 2023-8-5 23:55:11 | 显示全部楼层
回复 13# 77七


   感谢解答,这个似乎有局限性,用楼主层的文件测试是没有问题的,因为处理的代码比较短,我用另外一个文件测试,会提示 FINDSTR: Line 772 is too long.

这个是新的测试文件:
https://wwi.lanzoup.com/imB4X14kr4kh
 楼主| 发表于 2023-8-6 00:35:27 | 显示全部楼层
另外想请教个问题:
  1. gawk -v "IGNORECASE=1" "{print $0=gensub(/quest2/,"xyz","g")>"test.html"}" test.html
复制代码
我用上述代码,读取文件和生成文件指向同一个文件的时候,会导致内容缺失。不知道是什么原因?我有时候修改其他文件的时候倒没有这个问题。




或许可以吧
jyswjjgdwtdtj 发表于 2023-8-5 21:16


vbs代码执行时弹错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 14:31 , Processed in 0.025223 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表