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

[文本处理] 求BAT脚本能删除目录里txt文件里文字最后空行

[复制链接]
发表于 2024-5-9 17:03:47 | 显示全部楼层 |阅读模式
求教高手帮助制作一个BAT,要求拖动文件夹到目标BAT程序上,运用会删除文件夹下所有TXT内文字以后的空行。
发表于 2024-5-9 18:44:24 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-5-9 21:12 编辑

回复 1# dzwind

代码存为test.bat运行。
若要保留源文件*.txt,可删除第5行代码,其结果是在源文件目录中生成删除源文件末尾空行的新文件 *.new.txt

  1. @set @v=1 /*
  2. @echo off
  3. if "%~1" neq "" for /f "delims=" %%F in (' dir /b/s/a-d "%~1\*.txt" ') do (
  4.         cscript /e:jscript "%~f0" "%%~F" "%%~dpnF.new%%~xF"
  5.         move /y "%%~dpnF.new%%~xF" "%%~F">nul
  6. )
  7. pause&exit/b
  8. */
  9. v=WSH.arguments, as=WSH.createobject('adodb.stream');
  10. as.mode=3, as.type=2, as.charset='437', as.open, as.loadfromfile(v(0));
  11. alllines=as.readtext().split('\r\n'), as.close;
  12. for (; alllines.slice(-1)==''; alllines.pop()); //删除末尾1-n个空行
  13. as.open, as.writetext(alllines.join('\r\n'));
  14. as.savetofile(v(1),2), as.close; WSH.quit();
复制代码
发表于 2024-5-9 19:32:35 | 显示全部楼层
  1. @echo off
  2. cd /d "%~1" || exit
  3. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  4.         setlocal
  5.         (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%%i"') do (
  6.                 if "%%b" equ "" (
  7.                         set /a n+=1
  8.                 ) else (
  9.                         if defined n (
  10.                                 setlocal enabledelayedexpansion
  11.                                 for /l %%l in (1,1,!n!) do (
  12.                                         echo=
  13.                                 )
  14.                                 endlocal
  15.                                 set n=
  16.                         )
  17.                         echo=%%b
  18.                 )
  19.         ))>$
  20.         move $ "%%i"
  21.         endlocal
  22. )
  23. pause
复制代码
发表于 2024-5-9 21:08:44 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-5-9 21:12 编辑

回复 1# dzwind

用本论坛第三方下载的gawk.exe (http://bcn.bathome.net/s/tool/index.html?key=gawk) 可使批处理代码大为简化,但其只能删除文件最后一个空行,如须删除文件末尾多个连续空行,可用2楼代码...
若要保留源文件*.txt,可删除第4行代码,其结果是在源文件目录中生成删除源文件末尾空行的新文件 *.new.txt

  1. @echo off
  2. if "%~1" neq "" for /f "delims=" %%F in (' dir /b/s/a-d "%~1\*.txt" ') do (
  3.         gawk "NR>1{print p}{p=$0}END{printf $0}" "%%~F">"%%~dpnF.new%%~xF"
  4.         move /y "%%~dpnF.new%%~xF" "%%~F">nul
  5. )
  6. pause&exit/b
复制代码
 楼主| 发表于 2024-5-10 09:05:08 | 显示全部楼层
 楼主| 发表于 2024-5-10 21:24:13 | 显示全部楼层
回复 2# aloha20200628


    大师,您能否在2楼的句子上再给添加一个删除多余空格的句子。因为有的TXT文件里的内容最后面不仅有多余的空行,还有还有多余的空格,有的还有多行空行及空格。谢谢。
发表于 2024-5-10 22:26:08 | 显示全部楼层
回复 6# dzwind

删除文件末尾连续的空白字符(包括空格/制表符/换行符)

  1. @set @v=1 /*
  2. @echo off
  3. if "%~1" neq "" for /f "delims=" %%F in (' dir /b/s/a-d "%~1\*.txt" ') do (
  4.         cscript /e:jscript "%~f0" "%%~F" "%%~dpnF.new%%~xF"
  5.         move /y "%%~dpnF.new%%~xF" "%%~F">nul
  6. )
  7. pause&exit/b
  8. */
  9. v=WSH.arguments, as=WSH.createobject('adodb.stream');
  10. as.mode=3, as.type=2, as.charset='437', as.open, as.loadfromfile(v(0));
  11. s=as.readtext(), as.close, s=s.replace(/\s*$/, '');
  12. as.open, as.writetext(s), as.savetofile(v(1),2), as.close, WSH.quit();
复制代码
发表于 2024-5-11 09:32:42 | 显示全部楼层
回复 6# dzwind

这个用第3方工具sed( http://bcn.bathome.net/tool/4.9/sed.exe )的实现脚本如下:

  1. @echo off
  2. if "%~1" neq "" for /f "delims=" %%A in ('dir /b/s/a-d "%~1\*.txt"') do (
  3.         sed -i -z "/[ \t\n]*$/s///" "%%~A"
  4. )
复制代码
 楼主| 发表于 2024-5-11 09:54:20 | 显示全部楼层
再次感谢!!!!
发表于 2024-5-11 13:31:18 | 显示全部楼层
  1. @echo off
  2. for /r  %%a in (*.txt) do (
  3.    grep -Pv "^$" "%%a"
  4. ) >%%a.tmp
  5. pause
复制代码
  1. @echo off
  2. for /r  %%a in (*.txt) do (
  3.    gawk "!/^$/" "%%a"
  4. ) >%%a.tmp
  5. pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 01:20 , Processed in 0.020826 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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