Board logo

标题: [文本处理] 【已解决】求大佬帮忙写bat脚本,去除文本中自带规律序号的文本行的数字序号 [打印本页]

作者: kokoxx    时间: 2023-11-6 14:33     标题: 【已解决】求大佬帮忙写bat脚本,去除文本中自带规律序号的文本行的数字序号

本帖最后由 kokoxx 于 2023-11-6 19:26 编辑

rt,在bat处理的文本中(bat与处理对象txt处于同一文件夹下),需要处理的文本行的规律是数字序号后面带“.”且接下来就是“第X章 ”

希望这个bat能够去除符合条件的文本行开头的序号和序号后的“.”

举例:

【修改前】

103.第103章 我是赛罗奥特曼

104.第104章 他是泰罗奥特曼

第5章 奇迹奥特曼之父

谁是佐菲奥特曼

【修改后】

第103章 我是赛罗奥特曼

第104章 他是泰罗奥特曼

第5章 奇迹奥特曼之父

谁是佐菲奥特曼

----------------

测试样本

https://www.123pan.com/s/pbxrVv-vT9Y.html
作者: qixiaobin0715    时间: 2023-11-6 15:38

本帖最后由 qixiaobin0715 于 2023-11-6 17:08 编辑
  1. @echo off
  2. chcp 65001>nul
  3. (for /f "tokens=1*" %%i in (test.txt) do (
  4.     if "%%j"=="" (
  5.         echo,%%i
  6.     ) else (
  7.         for /f "tokens=1,2 delims=.第章" %%I in ("%%i") do (
  8.             if "%%I"=="%%J" (
  9.                 echo,第%%I章 %%j
  10.                 echo,
  11.             ) else (
  12.                 setlocal enabledelayed
  13.                 set m=%%I
  14.                 set /a n=m
  15.                 echo,%%i %%j
  16.                 if "%%I"=="!n!" echo,
  17.                 endlocal
  18.             )
  19.         )
  20.     )
  21. ))>New-test.txt
  22. pause
复制代码

作者: kokoxx    时间: 2023-11-6 15:55

回复 2# qixiaobin0715


    感谢大佬出手,不过您的代码执行后


103.第103章 我是赛罗奥特曼

104.第104章 他是泰罗奥特曼

第5章 奇迹奥特曼之父

谁是佐菲奥特曼


变成了

第103章 我是赛罗奥特曼
第104章 他是泰罗奥特曼
第5章 奇迹奥特曼之父
谁是佐菲奥特曼


也就是原有的空白空行都没了T-T
作者: ShowCode    时间: 2023-11-6 16:33

回复 3# kokoxx
  1. @echo off
  2. chcp 65001>nul
  3. (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "test.txt"') do (
  4.     if "%%b" equ "" (
  5.         echo,
  6.     ) else (
  7.         for /f "tokens=1*" %%i in ("%%b") do (
  8.             if "%%j"=="" (
  9.                 echo,%%i
  10.             ) else (
  11.                 for /f "tokens=1,2 delims=.第章" %%I in ("%%i") do (
  12.                     if "%%I"=="%%J" (
  13.                         echo,第%%I章 %%j
  14.                     ) else (
  15.                         echo,%%i %%j
  16.                     )
  17.                 )
  18.             )
  19.         )
  20.     )
  21. ))>"New-test.txt"
复制代码

作者: Five66    时间: 2023-11-6 16:41

  1. @echo off&pause&goto :haijimaru
  2. $null=@'
  3. :haijimaru
  4. powershell "$l='%~dp0';type -literalpath '%~f0'|select -skip 1|out-string|iex"
  5. pause&exit/b
  6. '@
  7. if(!$l){$l=$pwd.path+'\'}
  8. [io.directory]::getfiles($l,'*.txt')|%{
  9. $s=[regex]::replace([io.file]::ReadAllText($_,[text.encoding]::UTF8),'\d\d*\.(第\d\d*章)','$1')
  10. [io.file]::WriteAllText("$l\__new_"+$_.split('\')[-1],$s,[text.encoding]::UTF8)
  11. }
复制代码

作者: qixiaobin0715    时间: 2023-11-6 17:09

本帖最后由 qixiaobin0715 于 2023-11-10 09:57 编辑

回复 3# kokoxx
加上空行即可,已修改,不过不是太严谨。
作者: 77七    时间: 2023-11-6 18:04

  1. @echo off
  2. rem 批处理保存为utf-8编码格式
  3. chcp 65001 >nul
  4. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  5. setlocal
  6. for /f "tokens=1* delims=:" %%a in ('findstr /rnbc:"[0-9][0-9]*\." "%%i"') do (
  7. set _%%a=1
  8. )
  9. (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%%i"') do (
  10. if defined _%%a (
  11. set str=%%b
  12. setlocal enabledelayedexpansion
  13. echo !str:*.=!
  14. endlocal
  15. ) else (
  16. echo=%%b
  17. )
  18. ))>$
  19. move $ "%%i"
  20. endlocal
  21. )
  22. pause
复制代码

做好备份
作者: kokoxx    时间: 2023-11-6 18:50

回复 7# 77七


    您的代码在txt内容为

==========

103.第103章 我是赛罗奥特曼

104.第104章 他是泰罗奥特曼

第5章 奇迹奥特曼之父

003.谁是佐菲奥特曼

==========

时,会输出

==========

第103章 我是赛罗奥特曼

第104章 他是泰罗奥特曼

第5章 奇迹奥特曼之父

谁是佐菲奥特曼

==========

请问要怎么修改代码,才能让结果输出为

===========

第103章 我是赛罗奥特曼

第104章 他是泰罗奥特曼

第5章 奇迹奥特曼之父

003.谁是佐菲奥特曼

=========

也就是“003.谁是佐菲奥特曼”因为不符合带有“第x章”特征,所以不会被处理掉
作者: 77七    时间: 2023-11-6 18:57

回复 8# kokoxx


   第六行改一下
  1. for /f "tokens=1* delims=:" %%a in ('findstr /rnbc:"[0-9][0-9]*\." "%%i" ^|find ".第" ^|find "章"') do (
复制代码

作者: terse    时间: 2023-11-6 19:20

  1. @echo off&setlocal enabledelayedexpansion
  2. chcp 65001>nul
  3. for /f "tokens=1,2*delims=.:" %%i in ('findstr /ibn "[0-9][0-9]*\." test.txt') do set "_%%i=%%k"
  4. (for /f "tokens=1*delims=:" %%i in ('findstr /in .* test.txt') do (
  5.       if defined _%%i (
  6.          for /f %%a in ("!_%%i!") do for /f "tokens=1*delims=0123456789" %%b in ("%%a") do (
  7.               if "%%b%%c" == "第章" (echo !_%%i!)else echo %%j
  8.          )
  9.       )else  echo;%%j
  10. ))
  11. pause
复制代码

作者: terse    时间: 2023-11-6 20:38

z这个直接修改文件,运行前备份原文件
  1. @echo off
  2. powershell -c "$enc=[Text.Encoding]::UTF8;[IO.Directory]::EnumerateFiles($pwd,'*.txt').foreach({[IO.File]::WriteAllLines($_,([IO.File]::ReadAllLines($_,$enc) -replace '^\d+\.(?=第\d+章\s+.*)', ''),$enc) })"
  3. pause
复制代码

作者: qixiaobin0715    时间: 2023-11-10 10:50

本帖最后由 qixiaobin0715 于 2023-11-11 09:24 编辑

这样简单判断一下,也能应付绝大多数情况:
  1. @echo off
  2. chcp 65001>nul
  3. (for /f "tokens=1*" %%i in (test.txt) do (
  4.     if "%%j"=="" (
  5.         echo,%%i
  6.     ) else (
  7.         setlocal enabledelayedexpansion
  8.         set "str=%%i"
  9.         if "!str:~-1!"=="章" (
  10.             echo,!str:*.=! %%j
  11.             echo,
  12.         ) else (
  13.             echo,%%i %%j
  14.         )
  15.         endlocal
  16.     )
  17. ))>New-test.txt
  18. pause
复制代码
回头又看了看上面代码,感觉setlocal enabledelayedexpansion与endlocal纯属鸡肋,这里没特殊情况不需要频繁开关变量延迟功能,即使存在特殊字符,也应当将7-8行代码互换位置。可这样修改代码:
    直接将setlocal enabledelayedexpansion放在第2-3行之间即可,删除for循环中的setlocal enabledelayedexpansion与endlocal。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2