[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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是可以拼接的,还是很好奇,如何运用开始的思路来分离文本?

本帖最后由 77七 于 2023-8-6 17:14 编辑

文本行超长,批处理处理不了。要是我自己用的话,可以用第三方工具,linex和cfile ,都可以通过行号打印超长文本行。
打印第100行及接下来的10行
type 1.txt|linex -l 100 -e 10
linex -l 100 -e 10 <1.txt >2.txt
打印第100-110行
cfile 100,110 1.txt >2.txt
大概是这样。
bat小白,请多指教!谢谢!

TOP

回复 15# kidzgy

你看到分号就删一下呗

TOP

回复 5# kidzgy

3楼的代码针对原1楼提供的测试样本测试是有效的。
现针对https://wwi.lanzoup.com/iUDU114kcw4j提供的测试样本,修改如下,经测试有效:
  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}" test.html>b.txt
复制代码
1

评分人数

    • 77七: 感谢分享技术 + 1

TOP

回复 22# aloha20200628


    哈哈,其实我在楼主层末段已经说明了同样的方法。

TOP

回复 20# kidzgy


    单文件的gawk.exe好像得输出到临时文件再覆盖回去,git for windows里面的gawk就能用,装上也不亏毕竟git还是比较常用的。。。

TOP

针对LZ提供的测试文件,其实不用下载第三方,直接用下式
     findstr /LB "D.p(" "test2.html">"test2.html.new"
即可一步达成LZ所要结果(即使测试文件是utf-8编码,单行字符量远超8K) ... LZ是要求助有比其更'好'的方法吗? ...至今尚未看到...

TOP

回复 16# Five66

回复 19# aloha20200628

感谢两位,经测试,非常完美!

TOP

本帖最后由 kidzgy 于 2023-8-6 10:36 编辑

回复 17# wanghan519

在gawk使用 【-i inplace】参数时,即【gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' "test.html"】,会提示以下:
  1.     gawk: fatal: cannot open source file `inplace' for reading: No such file or directory
复制代码


不知道是哪里出了问题

更正:
不好意思,原来akw 和gawk不是同一个东西的嘛,所以如果要直接修改源文件的话,只能用sed -i 了?

TOP

回复 14# kidzgy

订正8L的代码如下,用14L提供的新测试文件验证成功。
  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" "test2.html" | sed -e "/^$/d" -e "$d" -e "1d">"test2.html.new"
复制代码
1

评分人数

    • 77七: 感谢分享技术 + 1

TOP

在cmd中无论是设置环境变量或是循环变量,其变量值都有限制。
楼主的文件直接用命令(比如type)显示没有问题,如果将其与变量建立联系,一旦超出长度限制,代码就会将其忽略。比如14楼提供的文件中的第99行,由于长度过长而超限,如果在for循环中读取,循环变量%%I就会将其忽略,而继续读取下一行。
所以不能考虑使用纯P来处理。

TOP

本帖最后由 wanghan519 于 2023-8-6 06:57 编辑

回复 15# kidzgy


    awk不能输入输出指向同一个文件,除非使用-i inplace参数或者使用sponge命令,但单文件的gawk没有这些。。。
sed可以用-i参数,用例子试了sed -i '1,/^[[:blank:]]*Array/d;/^[[:blank:]]*delete/,$d;/^$/d' test.html

TOP

回复 11# kidzgy

呃,测试文件是utf-8 bom编码的,而且换行符是LF,试试下面的

test.html为输入文件名
output.txt为输出文件名,输出文件编码跟换行符都跟测试文件一样的
代码保存为ansi就行了
  1. #@&cls&pause&powershell "gc -literalpath '%~f0'|out-string|iex"&pause&exit
  2. $inf="test.html"
  3. $otf="output.txt"
  4. $sstr="Array.prototype.p = Array.prototype.push;"
  5. $estr="delete(Array.prototype.p);"
  6. $inf=[io.file]::OpenRead($pwd.path+"\$inf")
  7. $otf=[io.file]::OpenWrite($pwd.path+"\$otf")
  8. $infrd=[System.IO.StreamReader]::new($inf,[text.encoding]::UTF8)
  9. $otfwd=[System.IO.StreamWriter]::new($otf,[text.encoding]::UTF8)
  10. $otfwd.NewLine=("`n")
  11. $s='';$bbb=0;
  12. while(!$infrd.EndOfStream){
  13. $s=$infrd.ReadLine()
  14. if($s){
  15. $ss=$s.Trim()
  16. if(($ss.Length -ge $estr.Length) -and ($ss.SubString(0,$estr.Length) -eq $estr)){break;}
  17. if($bbb){$otfwd.WriteLine($s);$s='';}
  18. if(($ss.Length -ge $sstr.Length) -and ($ss.SubString(0,$sstr.Length) -eq $sstr)){$bbb=1;}
  19. }}
  20. $infrd.Close();$otfwd.Close()
复制代码

TOP

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




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


vbs代码执行时弹错。

TOP

回复 13# 77七


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

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

TOP

返回列表