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

[文本处理] [已解决]删除特定字符所在的行

[复制链接]
发表于 2026-7-6 08:50:11 | 显示全部楼层 |阅读模式
本帖最后由 zhoubin 于 2026-7-14 08:44 编辑

有一文件office.reg,
office.reg中的字符]所在的行,若该行下面一行没有字符,则删除该行,批处理怎么写?
谢谢各位,谢谢!

代码在4楼,感谢aloha20200628;
10楼77七写的代码,也很好;
感谢各位坛友!!
发表于 2026-7-6 14:17:18 | 显示全部楼层
本帖最后由 aloha20200628 于 2026-7-7 15:51 编辑

理解题意为:删除指定文件中包含 ] 字符的文本行,如果其后是一个空行
以下批代码调用 powershell 处理会更简捷...

test.bat
  1. <# ::
  2. @echo off &setlocal &set "inF=office.reg" &set "outF=office.new.reg"
  3. powershell -nop -c "$f='%inF%'; iex(${%~f0}|out-string)">"%outF%"
  4. type "%outF%" &pause&exit/b
  5. #>
  6. $a=gc $f; for ($i=0; $i -lt $a.count; $i++) {
  7.    if ($a[$i].contains(']') -and $a[$i+1] -eq '') {continue}
  8.    $a[$i] }
  9. exit
复制代码

评分

参与人数 1技术 +1 收起 理由
zhoubin + 1 乐于助人

查看全部评分

 楼主| 发表于 2026-7-6 15:31:03 | 显示全部楼层
本帖最后由 zhoubin 于 2026-7-6 15:33 编辑

谢谢,这个能全字匹配吗?比如含有]"字符的行就不要删除了,谢谢!!
发表于 2026-7-6 16:55:28 | 显示全部楼层
本帖最后由 aloha20200628 于 2026-7-7 15:52 编辑
zhoubin 发表于 2026-7-6 15:31
谢谢,这个能全字匹配吗?比如含有]"字符的行就不要删除了,谢谢!!


订正如下...

test.bat
  1. <# ::
  2. @echo off &setlocal &set "inF=office.reg" &set "outF=office.new.reg"
  3. powershell -nop -c "$f='%inF%'; iex(${%~f0}|out-string)">"%outF%"
  4. type "%outF%" &pause&exit/b
  5. #>
  6. $a=gc $f; for ($i=0; $i -lt $a.count; $i++) {
  7.    if ($a[$i].contains(']') -and (-not $a[$i].contains('"')) -and $a[$i+1] -eq '') {continue}
  8.    $a[$i] }
  9. exit
复制代码

评分

参与人数 1技术 +1 收起 理由
zhoubin + 1 这个可以,感谢帮忙!!

查看全部评分

 楼主| 发表于 2026-7-6 17:48:56 | 显示全部楼层

我没说清楚,是包含字符]不带引号的行删除,包含字符]"带引号的行保留,辛苦了,谢谢!!
发表于 2026-7-6 18:22:46 | 显示全部楼层
4楼代码已订正》处理仅包含字符 ] 的文本行,不处理既包含字符 ] 也包含字符 " 的文本行...
 楼主| 发表于 2026-7-6 18:40:14 | 显示全部楼层
aloha20200628 发表于 2026-7-6 18:22
4楼代码已订正》处理仅包含字符 ] 的文本行,不处理既包含字符 ] 也包含字符 " 的文本行... ...

谢谢,4楼的代码可以了,谢谢您!!
发表于 2026-7-11 13:38:40 | 显示全部楼层
  1. @echo off
  2. chcp 65001 >nul
  3. cd /d "%~dp0"
  4. set oldfile=office.reg
  5. set newfile=office_2.reg
  6. for /f "tokens=1* delims=[]" %%a in ('find /n "]" ^< "%oldfile%" ^|find /v """"') do (
  7.         set @[%%a=1
  8. )

  9. for /f "tokens=1* delims=1234567890" %%a in ('find /n /v "" ^< "%oldfile%" ^& echo^=[1]') do (
  10.         set /a "m=(n+=1)-1"
  11.         if "%%b" equ "]" (
  12.                 call set #[%%m%%=1
  13.         )
  14. )

  15. (for /f "tokens=1* delims=]" %%a in ('find /n /v "" ^< "%oldfile%"') do (
  16.         if not defined #%%a (
  17.                 echo=%%b
  18.         ) else if not defined @%%a (
  19.                 echo=%%b
  20.         )
  21. )) > "%newfile%"
  22. pause
复制代码
 楼主| 发表于 2026-7-12 08:52:23 | 显示全部楼层
本帖最后由 zhoubin 于 2026-7-12 09:26 编辑


谢谢,用powershell处理的结果比较准确,比如: 问题反馈.txt (4.35 KB) 批处理没有处理好,谢谢

放一个简易测试文件 office.reg.txt (4.56 KB)
发表于 2026-7-12 13:35:43 | 显示全部楼层
zhoubin 发表于 2026-7-12 08:52
谢谢,用powershell处理的结果比较准确,比如:批处理没有处理好,谢谢

放一个简易测试文件 ...

reg文件含特殊字符stx,导致find断行错误。
以下用findstr写了下,对行首为[ 行尾为] 的行,如果其下一行为空,则删除

  1. @echo off
  2. chcp 65001 >nul
  3. cd /d "%~dp0"
  4. set oldfile=office.reg
  5. set newfile=office_2.reg

  6. (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%oldfile%" ^|more ^& echo 0:') do (
  7.         if "%%b" equ "" (
  8.                 if defined str (
  9.                         setlocal enabledelayedexpansion
  10.                         if "!str:~0,1!" equ "[" (
  11.                                 if "!str:~-1!" equ "]" (
  12.                                         set m=1
  13.                                 )
  14.                         )
  15.                         if not defined m (
  16.                                 echo !str!
  17.                         )
  18.                         endlocal
  19.                 )
  20.                 if "%%a" neq "0" (
  21.                         echo=
  22.                 )
  23.         ) else if defined str (
  24.                 setlocal enabledelayedexpansion
  25.                 echo !str!
  26.                 endlocal
  27.         )
  28.         set str=%%b
  29. )) > "%newfile%"
  30. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
zhoubin + 1 感谢分享

查看全部评分

 楼主| 发表于 2026-7-13 07:59:58 | 显示全部楼层
77七 发表于 2026-7-12 13:35
reg文件含特殊字符stx,导致find断行错误。
以下用findstr写了下,对行首为[ 行尾为] 的行,如果其下一行 ...

抽时间在Win11下,测试了一下,可以用了,谢谢您!!
发表于 2026-7-13 13:05:34 | 显示全部楼层
4楼的 powershell 算法得益于能够即时比对下一行是否为空行,用以下的 bat+jscript 很容易复刻,且实测两者运行耗时比约为 1:10,以下代码的效率明显高于 bat+powershell 版本...

test.bat
  1. 2>1/* ::
  2. @echo off &type "office.reg.txt" |cscript /nologo /e:jscript "%~f0">"office.reg.new.txt"
  3. type "office.reg.new.txt" &pause&exit/b */
  4. lines=WSH.stdin.readall().split('\r\n'); for (i=0,l=lines.length; i<l; i++) {
  5.    if (lines[i].indexOf(']')!=-1 && lines[i].indexOf('\"')==-1 && lines[i+1]=='') continue;
  6.    WSH.echo(lines[i]); }
  7. WSH.quit();
复制代码

评分

参与人数 1技术 +1 收起 理由
zhoubin + 1 这个代码,也可以,谢谢!!

查看全部评分

发表于 2026-7-13 14:03:26 | 显示全部楼层
本帖最后由 aloha20200628 于 2026-7-14 11:29 编辑

再改用以下的 bat+findstr 代码复刻 powershell 的算法,与4楼,12楼代码三者实测运行耗时比,结果约为
   bat+powershell : bat+jscript : bat+findstr = 10:1:3
但用批处逐行处理文本文件,会有每行字符量小于 8kb 的限制。

test.bat
  1. @echo off &setlocal &findstr /n .* "office.reg.txt">#.$
  2. (for /f "tokens=1* delims=:" %%a in (#.$) do (
  3.         set "s=%%b" &setlocal enabledelayedexpansion &set/a "n=%%a+1"
  4.         set "g=" &set "_s=!s:*]=!" &set "s_=!s:*"=!"
  5.         if "!s!" neq "!_s!" if "!s!"=="!s_!" (
  6.                 set "g=1" &for /f "tokens=1* delims=:" %%x in ('findstr /b "!n!:" #.$') do if "%%y" neq "" echo,!s!)
  7.         if not defined g echo,!s!
  8.         endlocal ))>"office.reg.new.txt"
  9. del /q #.$ &pause &exit/b
复制代码

评分

参与人数 1技术 +1 收起 理由
zhoubin + 1 不错,感谢分享!!

查看全部评分

 楼主| 发表于 2026-7-14 08:00:34 | 显示全部楼层
aloha20200628 发表于 2026-7-13 14:03
再改用以下的 bat+findstr 代码复刻 powershell 的算法,与4楼,12楼代码三者实测运行耗时比,结果约为
    ...

经反复测试,这个脚本,耗时较长,而且输出的结果有问题,真是奇怪;论坛不能传.reg文件,上面我传的简易测试.reg文件,都是加了.txt后缀的,论坛不能传太大的文件,完整的office.reg我传到百度盘了,供您参考,谢谢,辛苦了!!!
链接: https://pan.baidu.com/s/1zdLELX7fyttrbNOXnrmNVg?pwd=f6u8 提取码: f6u8
发表于 2026-7-14 08:16:22 | 显示全部楼层
zhoubin 发表于 2026-7-14 08:00
经反复测试,这个脚本,耗时较长,而且输出的结果有问题,真是奇怪;论坛不能传.reg文件,上面我传的简易 ...

换个思路:把你的.reg压缩成.zip或.rar
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-7-27 21:12

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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