标题: [文本处理] 【已解决】请帮忙给txt增加空白行的bat脚本 [打印本页]
作者: kokoxx 时间: 2023-9-23 09:35 标题: 【已解决】请帮忙给txt增加空白行的bat脚本
RT,这个bat脚本的作用是
将bat脚本同一个文件夹下的*.txt打开
检测到txt内容中有一个文本行的开头是“第 xxx 章”(xx是阿拉伯数字,允许xxx前后有若干空格,或没有空格),则在该文本行之前和之后添加三个空白文本行
举例:
【原版】
我是谁啊啊啊
第 1 章 奥特曼
谁说的啊啊啊
【修改版】
我是谁啊啊啊
第 1 章 奥特曼
谁说的啊啊啊
作者: qixiaobin0715 时间: 2023-9-23 09:46
像这种情况,最好在网盘上传一个真实文件,便于大家测试用。
作者: kokoxx 时间: 2023-9-23 09:58
回复 2# qixiaobin0715
https://www.123pan.com/s/pbxrVv-TNAY.html
提取码:6666
作者: hlzj88 时间: 2023-9-23 10:36
- @echo off&&setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b/on *.txt') do (
- for /f "delims=" %%j in ('type "%%i"') do (
- set "yj=%%j"
- echo !yj!
- set yj=!yj: =!
- echo !yj!|findstr /i "第[1-9].*章"&&echo.>>1.nul&&echo.>>1.nul&&echo.>>1.nul%%echo !yj!>>1.nul&&echo.>>1.nul&&echo.>>1.nul&&echo.>>1.nul || echo !yj!>>1.nul
- )
- move /y 1.nul %%i>nul
- )
- pause
复制代码
作者: 77七 时间: 2023-9-23 11:22
- @echo off
- rem 批处理保存为utf-8编码格式
- chcp 65001 >nul
- for /f "useback delims=" %%i in (`dir /b /a-d *.txt`) do (
- setlocal
- for /f "useback tokens=1* delims=[]" %%a in (`find /n /v "" ^<"%%i" ^|find "]第" ^|find "章"`) do (
- set _"%%a"=1
- )
- (for /f "useback tokens=1* delims=[]" %%a in (`find /n /v "" ^<"%%i"`) do (
- if not defined _"%%a" (
- echo=%%b
- ) else (
- echo=
- echo=
- echo=
- echo=%%b
- echo=
- echo=
- echo=
- )
- ))>$
- move $ "%%i"
- endlocal
- )
- pause
复制代码
使用前先备份!可能会有误差,如果”章“后面有个空格,代码改为 find "章 " 误差应该小点
作者: 77七 时间: 2023-9-23 13:49
wfr
http://bcn.bathome.net/tool/wfr.exe
- wfr *.txt /encin:utf-8 /encout:utf-8 -r:"^\s*第\s*\d+\s*章.*" -t:"\n\n\n\0\n\n\n"
复制代码
作者: Five66 时间: 2023-9-23 17:04
不知行否,会在原本文件名前面添加new_创建新文件- @echo off
-
- set "z=绗.*绔"
-
- chcp 65001
- for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
- setlocal
-
- (for /f "delims=" %%k in ('findstr /n .* "%%i"') do (
- set "str=%%k"
- setlocal enabledelayedexpansion
- echo=!str:*:=!|findstr /i /b "!z!" 1>nul && set aaa=1
- if defined aaa (
- echo=&echo=&echo=
- echo=!str:*:=!
- echo=&echo=&echo=
- set aaa=
- ) else (
- echo=!str:*:=!
- )
- endlocal
- ))>"new_%%i.txt"
-
- endlocal
- )
-
- chcp 936&echo done&pause&exit /b
复制代码
作者: kokoxx 时间: 2023-9-23 17:23
回复 5# 77七
大佬,试过了你的脚本,确实有用
追加一个提问:
如果我要实现 文本行同时出现“第x章”和“此行不做添加空行处理”(举例,可以在代码里修改成任意值)字样,就不做添加空行处理,该怎么在原有代码的基础上做修改
举例:
【原版】
我是赛罗奥特曼
第1章 变身
我是泰罗奥特曼
第2章 此行不做添加空行处理
我是迪迦奥特曼
【修改后效果】
我是赛罗奥特曼
第1章 变身
我是泰罗奥特曼
第2章 此行不做添加空行处理
我是迪迦奥特曼
作者: 77七 时间: 2023-9-23 17:53
回复 8# kokoxx
代码第6行改为
- for /f "useback tokens=1* delims=[]" %%a in (`find /n /v "" ^<"%%i" ^|find "]第" ^|find "章" ^|find /v "此行不做添加空行处理"`) do (
复制代码
作者: kokoxx 时间: 2023-9-23 18:06
回复 9# 77七
最后一个问题
如何用bat在同文件夹下*.txt的行与行之间增加一个空白行?
-- 嗯,我知道这个功能用wps或word可以很轻松实现,但是代价是wps/word处理大体积txt(超过5m)时,会出现卡死崩溃现象
-- 本来是想单独再发一个求助帖,不过有自我觉得这么搞有发垃圾求助帖的嫌疑,就只能再叨扰大佬了(捂脸)~
举例:
【原版(不包括引号)】
“
我是奥特曼
你也是奥特曼
”
【修改后版本(不包括引号)】
“
我是奥特曼
你也是奥特曼
”
作者: 77七 时间: 2023-9-23 18:16
回复 10# kokoxx
- @echo off
- rem 批处理保存为utf-8编码格式
- chcp 65001 >nul
- for /f "useback delims=" %%i in (`dir /b /a-d *.txt`) do (
- (for /f "useback tokens=1* delims=[]" %%a in (`find /n /v "" ^<"%%i"`) do (
- echo=
- echo=%%b
- ))>$
- move $ "%%i"
- )
- pause
复制代码
作者: kokoxx 时间: 2023-9-25 09:50
回复 11# 77七
大佬,又来叨扰您了
请问bat能否做到查找同文件夹下的*.txt中包含有“猜你喜欢:”和“更多推荐:”的一行后,将其所在的一行替换为空行
举例:
【原版】
我是奥特曼
猜你喜欢:斗破苍穹 武动乾坤 神墓
更多推荐:斗破苍穹 武动乾坤 神墓
你也是奥特曼
【修改后效果】
我是奥特曼
你也是奥特曼
作者: Batcher 时间: 2023-9-25 10:19
回复 12# kokoxx - @echo off
- chcp 65001 >nul
- cd /d "%~dp0"
- for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
- echo %%i
- findstr /i /v /c:"猜你喜欢:" /c:"更多推荐:" "%%i" > "%%i.ttttt"
- move /y "%%i.ttttt" "%%i" >nul
- )
复制代码
作者: kokoxx 时间: 2023-9-25 10:47
回复 13# Batcher
感谢大佬百忙中出手,不过我这边测试无效T-T
附带一个测试失败的样本:
https://www.123pan.com/s/pbxrVv-ROAY.html
作者: Batcher 时间: 2023-9-25 11:08
回复 14# kokoxx
12楼给的例子是中文冒号,14楼给的样本是英文冒号。你根据实际情况修改代码再试试吧。
作者: kokoxx 时间: 2023-9-25 11:12
本帖最后由 kokoxx 于 2023-9-25 11:13 编辑
回复 15# Batcher
我是直接将测试样本里的对应文本(包括冒号)复制粘贴的,最起码的关键词替换我还是懂的……
作者: 77七 时间: 2023-9-25 12:11
回复 12# kokoxx
- @echo off
- rem 批处理保存为utf-8编码格式
- chcp 65001 >nul
- for /f "useback delims=" %%i in (`dir /b /a-d *.txt`) do (
- setlocal
- for /f "useback tokens=1* delims=[]" %%a in (`find /n "猜你喜欢:" ^<"%%i"`) do (
- set _"%%a"=1
- )
- for /f "useback tokens=1* delims=[]" %%a in (`find /n "更多推荐:" ^<"%%i"`) do (
- set _"%%a"=1
- )
- (for /f "useback tokens=1* delims=[]" %%a in (`find /n /v "" ^<"%%i"`) do (
- if not defined _"%%a" (
- echo=%%b
- ) else (
- echo=
- )
- ))>$
- move $ "%%i"
- endlocal
- )
- pause
复制代码
作者: kokoxx 时间: 2023-9-25 12:56
回复 17# 77七
感谢大佬答复
我这边将关键词去掉冒号(将`find /n "猜你喜欢:" ^<"%%i"` 改成`find /n "猜你喜欢" ^<"%%i"` )测试成功
至于为啥要去掉冒号才成功,我也不知道为什么~
作者: 77七 时间: 2023-9-25 13:14
回复 18# kokoxx
应该是 猜你喜欢: 这个字符串在原文中没有找到。
使用你提供的文件,我这里测试正常。
作者: kokoxx 时间: 2023-9-25 15:17
回复 19# 77七
大佬,我又双叒叕要叨扰您了~
还是处理txt文本,希望能实现如下功能:
查找定位bat同文件夹下*.txt中所有带.html的文本行
将该文本行连同该文本行上面的两个文本行和下面的一行文本行,替换成一个文本行
举例
【原版】
1我是是是是www啊啊
2www啊啊
3呜呜呜呜谁反对
4奥术大师多
5 1212.html 我说的
6阿勒泰堵塞
7阿萨德
8大额ad
【修改后版】
1我是是是是www啊啊
2www啊啊
7阿萨德
8大额ad
--------
测试样本
https://www.123pan.com/s/pbxrVv-lOAY.html
作者: 77七 时间: 2023-9-25 16:05
回复 20# kokoxx
- @echo off
- rem 批处理保存为utf-8编码格式
- chcp 65001 >nul
- for /f "useback delims=" %%i in (`dir /b /a-d *.txt`) do (
- setlocal
- for /f "useback tokens=1* delims=[]" %%a in (`find /n ".html" ^<"%%i"`) do (
- for %%x in (-2 -1 0 1) do (
- set /a n=%%a+%%x
- call set _"%%n%%"=1
- )
- )
- (for /f "useback tokens=1* delims=[]" %%a in (`find /n /v "" ^<"%%i"`) do (
- if not defined _"%%a" (
- if defined m (
- echo=
- set m=
- )
- echo=%%b
- ) else (
- set m=1
- )
- ))>$
- move $ "%%i"
- endlocal
- )
- pause
复制代码
作者: kokoxx 时间: 2023-9-25 16:15
回复 21# 77七
感谢大佬,测试通过
提问:如果我要实现在.html所在文本行上数4行,下数2行都做成空白行
就是将
for %%x in (-2 -1 0 1) do (
改成
for %%x in (-4 -3 -2 -1 0 1 2) do (
对吧?
作者: 77七 时间: 2023-9-25 16:18
回复 22# kokoxx
对的,7行缩成一行空白
作者: qixiaobin0715 时间: 2023-9-27 11:41
本帖最后由 qixiaobin0715 于 2023-9-27 14:50 编辑
回复 20# kokoxx
使用变量迭代法不知是否可行。这样可以防止定义变量太多而引起的效率不高的问题:- @echo off
- chcp 65001>nul
- for /f "delims=" %%I in ('dir /b /a-d *.txt') do (
- setlocal enabledelayedexpansion
- set n=1
- (for /f "tokens=1* delims=:" %%i in ('findstr /n .* "%%I"') do (
- set /a n+=1
- set s1=!s2!
- set s2=!s3!
- set s3=%%j
- if defined s3 (
- set s=!s3:.html=!
- if not "!s!"=="!s3!" (
- set n=0
- echo,
- )
- )
- if !n! geq 4 echo,!s1!
- )
- if !n! geq 3 (
- echo,!s2!
- echo,!s3!
- ) else if !n! equ 2 (
- echo,!s3!
- ))>temp
- move "temp" "%%I"
- endlocal
- )
- pause
复制代码
代码未经测试,可能有问题,思路应当是对的。
作者: qixiaobin0715 时间: 2023-9-27 17:30
本帖最后由 qixiaobin0715 于 2023-9-27 20:35 编辑
回复 22# kokoxx
行数过多的话可以这样写比较简洁一些:- for /l %%i in (-4,1,2) do (...
复制代码
作者: qixiaobin0715 时间: 2023-9-28 16:20
回复 18# kokoxx - @echo off
- chcp 65001>nul
- set /a _"猜你喜欢"=_"更多推荐"=1
- for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
- (for /f "tokens=1,2* delims=::" %%a in ('findstr /n .* "%%i"') do (
- if defined _"%%b" (
- echo,
- ) else (
- if "%%c"=="" (
- echo,%%b
- ) else (
- echo,%%b:%%c
- )
- )
- ))>temp
- move "temp" "%%i"
- )
- pause
复制代码
作者: qixiaobin0715 时间: 2023-9-28 17:09
回复 8# kokoxx - @echo off
- chcp 65001>nul
- for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
- (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%%i"') do (
- if "%%b"=="" (
- echo,
- ) else (
- for /f "tokens=1,2* delims=0123456789 " %%j in ("%%b") do (
- if "%%j%%k"=="第章" (
- if "%%l"=="此行不做添加空行处理" (
- echo,%%b
- ) else (
- echo,
- echo,
- echo,
- echo,%%b
- echo,
- echo,
- echo,
- )
- ) else (
- echo,%%b
- )
- )
- )
- ))>temp
- move "temp" "%%i"
- )
- pause
复制代码
作者: kokoxx 时间: 2023-12-8 19:26
回复 17# 77七
大佬您好,时隔多日后,再度叨扰您
如果这里要求是将符合指定关键字条件(“猜你喜欢:”和“更多推荐”)的所在行直接删除,而不是将之变成一个空白行,将如何修改第14行的“echo=%%b”?
作者: 77七 时间: 2023-12-8 19:47
回复 28# kokoxx
- (for /f "useback tokens=1* delims=[]" %%a in (`find /n /v "" ^<"%%i"`) do (
- if not defined _"%%a" (
- echo=%%b
- )
- ))>$
复制代码
12-18行改为上面的,即去掉else (echo=)
作者: kokoxx 时间: 2024-1-27 13:47
回复 11# 77七
大佬,抱歉又来叨扰您了
您能不能出手写一个bat,实现将bat同文件夹下的txt里的x个连续空白文本行替换成y个空白行(用wps或word的话,如果txt很大(超过4m),程序就会卡死T-T)
这里假定x=3,y=2
【处理前】
我是谁
我是谁
我是谁
【处理后】
我是谁
我是谁
我是谁
作者: hfxiang 时间: 2024-1-27 16:56
本帖最后由 hfxiang 于 2024-1-27 16:59 编辑
回复 30# kokoxx
可试一下sed( http://bcn.bathome.net/tool/4.9/sed.exe )
假定 x=3,y=2- sed -z -r "s/^\n{3}\b/\n\n/;s/\b\n{4}\b/\n\n\n/g" 1.txt>2.txt
复制代码
假定 x=3~10,y=2- sed -z -r "s/^\n{3,10}\b/\n\n/;s/\b\n{4,11}\b/\n\n\n/g" 1.txt>2.txt
复制代码
作者: 77七 时间: 2024-1-27 19:06
回复 30# kokoxx
- @echo off
- rem 批处理保存为utf-8编码格式
- chcp 65001 >nul
- cd /d "%~dp0"
- set /a x=3,y=2
- for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
- setlocal
- (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%%i"') do (
- if "%%b" equ "" (
- set /a n+=1
- ) else if defined n (
- set /a m=n/x*y+n%%x
- set n=
- setlocal enabledelayedexpansion
- for /l %%l in (1,1,!m!) do (
- echo=
- )
- endlocal
- echo=%%b
- ) else (
- echo=%%b
- )
- ))>$
- move $ "%%i"
- endlocal
- )
- pause
复制代码
作者: kokoxx 时间: 2024-4-3 10:03
回复 32# 77七
大佬您好,您之前写过一个脚本,用于删除txt包含特定文本(比如“标签”)的文本行附近的文本行- @echo off
- chcp 65001 >nul
- for /f "useback delims=" %%i in (`dir /b /a-d *.txt`) do (
- setlocal
- for /f "useback tokens=1* delims=[]" %%a in (`find /n "标签" ^<"%%i"`) do (
- for %%x in ( 0 ) do (
- set /a n=%%a+%%x
- call set _"%%n%%"=1
- )
- )
- (for /f "useback tokens=1* delims=[]" %%a in (`find /n /v "" ^<"%%i"`) do (
- if not defined _"%%a" (
- echo=%%b
- )
- ))>$
- move $ "%%i"
- endlocal
- )
- pause
复制代码
现在想用类似的bat写法实现
【处理前】
=== 第1章奥特曼
【处理后】
=== 第1章 奥特曼
(案例结束)
也就是将符合标准的文本行(关键词是“=== 第”)中的“章”变成“章 ”
该怎么修改?
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |