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

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

本帖最后由 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是可以拼接的,还是很好奇,如何运用开始的思路来分离文本?

  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
复制代码
bat小白,请多指教!谢谢!

TOP

回复 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
复制代码

TOP

sed删除1到Array那一行,再删除delete到最后一行,也许可以
  1. sed '1,/^Array/d;/^delete/,$d' a.txt
复制代码

TOP

77七 发表于 2023-8-5 01:31



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



  两个输出都是空白文件

TOP

回复 5# kidzgy


   参考2楼代码第2行。
bat小白,请多指教!谢谢!

TOP

本帖最后由 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;
复制代码

TOP


用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"
复制代码

TOP


再给一个尽量简化的纯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. )
复制代码

TOP

回复 1# kidzgy


    请把文件上传到网盘以便测试代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 7# Five66


   

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


现在已在楼主层附上测试文件。

TOP

  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)
复制代码
或许可以吧

TOP

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"
复制代码
bat小白,请多指教!谢谢!

TOP

回复 13# 77七


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

这个是新的测试文件:
https://wwi.lanzoup.com/imB4X14kr4kh

TOP

另外想请教个问题:
  1. gawk -v "IGNORECASE=1" "{print $0=gensub(/quest2/,\"xyz\",\"g\")>\"test.html\"}" test.html
复制代码
我用上述代码,读取文件和生成文件指向同一个文件的时候,会导致内容缺失。不知道是什么原因?我有时候修改其他文件的时候倒没有这个问题。




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


vbs代码执行时弹错。

TOP

返回列表