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

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

[复制链接]
发表于 2023-8-6 01:08:37 | 显示全部楼层
回复 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()

复制代码
发表于 2023-8-6 06:50:00 | 显示全部楼层
本帖最后由 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
发表于 2023-8-6 08:58:49 | 显示全部楼层
在cmd中无论是设置环境变量或是循环变量,其变量值都有限制。
楼主的文件直接用命令(比如type)显示没有问题,如果将其与变量建立联系,一旦超出长度限制,代码就会将其忽略。比如14楼提供的文件中的第99行,由于长度过长而超限,如果在for循环中读取,循环变量%%I就会将其忽略,而继续读取下一行。
所以不能考虑使用纯P来处理。
发表于 2023-8-6 10:11:11 | 显示全部楼层
回复 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技术 +1 收起 理由
77七 + 1 感谢分享

查看全部评分

 楼主| 发表于 2023-8-6 10:26:14 | 显示全部楼层
本帖最后由 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 了?
 楼主| 发表于 2023-8-6 10:37:31 | 显示全部楼层
回复 16# Five66

回复 19# aloha20200628

感谢两位,经测试,非常完美!
发表于 2023-8-6 11:11:16 | 显示全部楼层
针对LZ提供的测试文件,其实不用下载第三方,直接用下式
     findstr /LB "D.p(" "test2.html">"test2.html.new"
即可一步达成LZ所要结果(即使测试文件是utf-8编码,单行字符量远超8K) ... LZ是要求助有比其更'好'的方法吗? ...至今尚未看到...
发表于 2023-8-6 12:13:53 | 显示全部楼层
回复 20# kidzgy


    单文件的gawk.exe好像得输出到临时文件再覆盖回去,git for windows里面的gawk就能用,装上也不亏毕竟git还是比较常用的。。。
 楼主| 发表于 2023-8-6 12:49:46 | 显示全部楼层
回复 22# aloha20200628


    哈哈,其实我在楼主层末段已经说明了同样的方法。
发表于 2023-8-6 13:10:07 | 显示全部楼层
回复 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技术 +1 收起 理由
77七 + 1 感谢分享

查看全部评分

发表于 2023-8-6 13:12:25 | 显示全部楼层
回复 15# kidzgy

你看到分号就删一下呗
发表于 2023-8-6 17:10:02 | 显示全部楼层
本帖最后由 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
大概是这样。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 15:37 , Processed in 0.017105 second(s), 6 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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