标题: [文本处理] 【已解决】求大佬帮忙写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 编辑
- @echo off
- chcp 65001>nul
- (for /f "tokens=1*" %%i in (test.txt) do (
- if "%%j"=="" (
- echo,%%i
- ) else (
- for /f "tokens=1,2 delims=.第章" %%I in ("%%i") do (
- if "%%I"=="%%J" (
- echo,第%%I章 %%j
- echo,
- ) else (
- setlocal enabledelayed
- set m=%%I
- set /a n=m
- echo,%%i %%j
- if "%%I"=="!n!" echo,
- endlocal
- )
- )
- )
- ))>New-test.txt
- 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 - @echo off
- chcp 65001>nul
- (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "test.txt"') do (
- if "%%b" equ "" (
- echo,
- ) else (
- for /f "tokens=1*" %%i in ("%%b") do (
- if "%%j"=="" (
- echo,%%i
- ) else (
- for /f "tokens=1,2 delims=.第章" %%I in ("%%i") do (
- if "%%I"=="%%J" (
- echo,第%%I章 %%j
- ) else (
- echo,%%i %%j
- )
- )
- )
- )
- )
- ))>"New-test.txt"
复制代码
作者: Five66 时间: 2023-11-6 16:41
- @echo off&pause&goto :haijimaru
- $null=@'
- :haijimaru
- powershell "$l='%~dp0';type -literalpath '%~f0'|select -skip 1|out-string|iex"
- pause&exit/b
- '@
-
- if(!$l){$l=$pwd.path+'\'}
- [io.directory]::getfiles($l,'*.txt')|%{
- $s=[regex]::replace([io.file]::ReadAllText($_,[text.encoding]::UTF8),'\d\d*\.(第\d\d*章)','$1')
- [io.file]::WriteAllText("$l\__new_"+$_.split('\')[-1],$s,[text.encoding]::UTF8)
- }
复制代码
作者: qixiaobin0715 时间: 2023-11-6 17:09
本帖最后由 qixiaobin0715 于 2023-11-10 09:57 编辑
回复 3# kokoxx
加上空行即可,已修改,不过不是太严谨。
作者: 77七 时间: 2023-11-6 18:04
- @echo off
- rem 批处理保存为utf-8编码格式
- chcp 65001 >nul
- for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
- setlocal
- for /f "tokens=1* delims=:" %%a in ('findstr /rnbc:"[0-9][0-9]*\." "%%i"') do (
- set _%%a=1
- )
- (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%%i"') do (
- if defined _%%a (
- set str=%%b
- setlocal enabledelayedexpansion
- echo !str:*.=!
- endlocal
- ) else (
- echo=%%b
- )
- ))>$
- move $ "%%i"
- endlocal
- )
- 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
第六行改一下- for /f "tokens=1* delims=:" %%a in ('findstr /rnbc:"[0-9][0-9]*\." "%%i" ^|find ".第" ^|find "章"') do (
复制代码
作者: terse 时间: 2023-11-6 19:20
- @echo off&setlocal enabledelayedexpansion
- chcp 65001>nul
- for /f "tokens=1,2*delims=.:" %%i in ('findstr /ibn "[0-9][0-9]*\." test.txt') do set "_%%i=%%k"
- (for /f "tokens=1*delims=:" %%i in ('findstr /in .* test.txt') do (
- if defined _%%i (
- for /f %%a in ("!_%%i!") do for /f "tokens=1*delims=0123456789" %%b in ("%%a") do (
- if "%%b%%c" == "第章" (echo !_%%i!)else echo %%j
- )
- )else echo;%%j
- ))
- pause
复制代码
作者: terse 时间: 2023-11-6 20:38
z这个直接修改文件,运行前备份原文件- @echo off
- powershell -c "$enc=[Text.Encoding]::UTF8;[IO.Directory]::EnumerateFiles($pwd,'*.txt').foreach({[IO.File]::WriteAllLines($_,([IO.File]::ReadAllLines($_,$enc) -replace '^\d+\.(?=第\d+章\s+.*)', ''),$enc) })"
- pause
复制代码
作者: qixiaobin0715 时间: 2023-11-10 10:50
本帖最后由 qixiaobin0715 于 2023-11-11 09:24 编辑
这样简单判断一下,也能应付绝大多数情况:- @echo off
- chcp 65001>nul
- (for /f "tokens=1*" %%i in (test.txt) do (
- if "%%j"=="" (
- echo,%%i
- ) else (
- setlocal enabledelayedexpansion
- set "str=%%i"
- if "!str:~-1!"=="章" (
- echo,!str:*.=! %%j
- echo,
- ) else (
- echo,%%i %%j
- )
- endlocal
- )
- ))>New-test.txt
- pause
复制代码
回头又看了看上面代码,感觉setlocal enabledelayedexpansion与endlocal纯属鸡肋,这里没特殊情况不需要频繁开关变量延迟功能,即使存在特殊字符,也应当将7-8行代码互换位置。可这样修改代码:
直接将setlocal enabledelayedexpansion放在第2-3行之间即可,删除for循环中的setlocal enabledelayedexpansion与endlocal。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |