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

[文本处理] 【已解决】求BAT脚本替换txt的“连续空白行+非空白行句首空格”为指定数目空白行

本帖最后由 kokoxx 于 2024-3-11 16:23 编辑

RT,求大佬出手,写一个替换txt的“连续空白行+非空白行句首空格”的bat

该bat的功能如下

【使用前】
我是奥特曼


我是泰罗

(注:文本内容到此结束)
(注2:上文中“我是泰罗”前面有一个空格,也就是“ 我是泰罗”,但是我这边发帖后显示成“我是泰罗”,但实际应该是“ 我是泰罗”)
【使用后】
我是奥特曼

我是泰罗

(注:文本内容到此结束)
--------

希望bat里要处理的连续空白行数目(x)和连续空白行数目之后的非空白行句首空格数目(y),还有替换后的空白行数目(z),都可以由用户自己在bat源文件里自己指定,也就是做成可以由用户自定义赋值的变量

注:word/wps的确可以实现类似的功能,但处理大体积txt(大于4m)时,会出现卡死和风扇狂转现象……

多个连续空白行合并为一个可使用:
  1. more /s 1.txt
复制代码

TOP

  1. @echo off
  2. rem 批处理保存为utf-8编码格式
  3. chcp 65001 >nul
  4. set /a y=空格=3,x=空白行=2,z=替换行=1
  5. cd /d "%~dp0"
  6. setlocal enabledelayedexpansion
  7. for /l %%l in (1,1,%y%) do (
  8. set "l=!l! "
  9. )
  10. endlocal & set _y=%l%
  11. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  12. setlocal
  13. (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%%i"') do (
  14. if "%%b" equ "" (
  15. set /a m+=1
  16. ) else if defined m (
  17. set str=%%b
  18. setlocal enabledelayedexpansion
  19. if !m! equ %x% (
  20. if "!str:~0,%y%!" equ "%_y%" (
  21. if "!str:~%y%,1!" neq " " (
  22. for /l %%l in (1,1,%z%) do (
  23. echo=
  24. )
  25. echo=!str:~%y%!
  26. endlocal
  27. set m=
  28. )
  29. )
  30. )
  31. if defined m (
  32. for /l %%l in (1,1,!m!) do (
  33. echo=
  34. )
  35. endlocal
  36. echo=%%b
  37. set m=
  38. )
  39. ) else (
  40. echo=%%b
  41. )
  42. ))>$
  43. move $ "%%i"
  44. endlocal
  45. )
  46. pause
复制代码
bat小白,请多指教!谢谢!

TOP

回复 3# 77七


    测试通过,多谢大佬!

TOP

不知行否
保存为ansi编码的bat
  1. #?&cls&pause&powershell -c "type -literalpath '%~f0'|out-string|iex"&pause&exit
  2. #空白行数目,0是任意个,n是n个以上
  3. $x=0
  4. #空格数,0是任意个,n是n个以上
  5. $y=0
  6. #空白行或空格"n个以上"的最大值,设为0时"n个以上"仅有n个
  7. $lmt=0
  8. #空白行替换后的行数
  9. $z=1
  10. #替换后的空格数
  11. $z2=0
  12. #需要处理的文件名或路径,批量处理时改成获取文件(名)的命令
  13. $f="aaa.txt"
  14. #文件编码
  15. $cd="utf8"
  16. #仅匹配空行
  17. if($lmt -lt $x){$m=$x}else{$m=$lmt}
  18. if($x -eq 0){$r="\r?\n(\r?\n)+"}else{$r="\r?\n(\r?\n){$x,$m}"}
  19. if($lmt -lt $y){$m=$y}else{$m=$lmt}
  20. if($y -eq 0){$r+="  *"}else{$r=$r+" {$y,$m}"}
  21. $p="`r`n"+"`r`n"*($z-1)+" "*$z2
  22. $f|%{
  23. $file=[io.fileinfo]$_
  24. $filepath=$file.DirectoryName+"\_new_"+$file.name
  25. [regex]::replace([io.file]::ReadAllText($file,$cd),$r,$p)|sc -LiteralPath ($filepath) -Encoding ($cd)
  26. [console]::writeline("已保存到: "+$filepath)
  27. }
复制代码

TOP

回复 1# kokoxx

可借用第3方工具gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )来实现:
  1. @echo off&cd /d "%~dp0"
  2. rem 注意gawk参数:-v"Spaces=4"表示每行给4个前置空格,-v"BlankLines=1"表示每行间空1行
  3. for /f "delims=" %%i in ('dir /b/s/a-d *.txt') do (
  4. gawk -v"Spaces=4" -v"BlankLines=1" "BEGIN{if(Spaces<0)Spaces=0;for(i=1;i<=Spaces;i++){S=S OFS};L=ORS;if(BlankLines<0)BlankLines=0;L=ORS;for(i=1;i<=BlankLines;i++){ORS=ORS L}}{sub(/^[ \t]+/,\"\");sub(/[ \t]+$/,\"\");if($0)print S $0}" "%%~i">"%%~dpni.bak"
  5. move /y "%%~dpni.bak" "%%~i"
  6. )
复制代码

TOP

返回列表