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

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

[复制链接]
发表于 2024-3-11 09:49:46 | 显示全部楼层 |阅读模式
本帖最后由 kokoxx 于 2024-3-11 16:23 编辑

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

该bat的功能如下

【使用前】
我是奥特曼


我是泰罗

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

我是泰罗

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

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

注:word/wps的确可以实现类似的功能,但处理大体积txt(大于4m)时,会出现卡死和风扇狂转现象……
发表于 2024-3-11 10:07:15 | 显示全部楼层
多个连续空白行合并为一个可使用:
  1. more /s 1.txt
复制代码
发表于 2024-3-11 11:57:44 | 显示全部楼层
  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
复制代码
 楼主| 发表于 2024-3-11 16:22:59 | 显示全部楼层
回复 3# 77七


    测试通过,多谢大佬!
发表于 2024-3-11 17:03:29 | 显示全部楼层
不知行否
保存为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. }
复制代码
发表于 2024-3-11 17:35:04 | 显示全部楼层
回复 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. )
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 05:46 , Processed in 0.066986 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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