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

本帖最后由 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

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

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

本帖最后由 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

回复 16# Five66

回复 19# aloha20200628

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

TOP

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

TOP

回复 20# kidzgy


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

TOP

回复 22# aloha20200628


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

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

回复 15# kidzgy

你看到分号就删一下呗

TOP

本帖最后由 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

返回列表