Board logo

标题: [文本处理] 【已解决】请帮忙给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

  1. @echo off&&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /b/on *.txt') do (
  3.     for /f "delims=" %%j in ('type "%%i"') do (
  4.       set "yj=%%j"
  5.       echo !yj!
  6.       set yj=!yj: =!
  7.       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
  8.    )
  9. move /y 1.nul %%i>nul
  10. )
  11. pause
复制代码

作者: 77七    时间: 2023-9-23 11:22

  1. @echo off
  2. rem 批处理保存为utf-8编码格式
  3. chcp 65001 >nul
  4. for /f "useback delims=" %%i in (`dir /b /a-d *.txt`) do (
  5. setlocal
  6. for /f "useback tokens=1* delims=[]" %%a in (`find /n /v "" ^<"%%i" ^|find "]第" ^|find "章"`) do (
  7. set _"%%a"=1
  8. )
  9. (for /f "useback tokens=1* delims=[]" %%a in (`find /n /v "" ^<"%%i"`) do (
  10. if not defined _"%%a" (
  11. echo=%%b
  12. ) else (
  13. echo=
  14. echo=
  15. echo=
  16. echo=%%b
  17. echo=
  18. echo=
  19. echo=
  20. )
  21. ))>$
  22. move $ "%%i"
  23. endlocal
  24. )
  25. pause
复制代码

使用前先备份!可能会有误差,如果”章“后面有个空格,代码改为 find "章 " 误差应该小点
作者: 77七    时间: 2023-9-23 13:49

wfr
http://bcn.bathome.net/tool/wfr.exe

  1. 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_创建新文件
  1. @echo off
  2. set "z=绗.*绔"
  3. chcp 65001
  4. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  5. setlocal
  6. (for /f "delims=" %%k in ('findstr /n .* "%%i"') do (
  7. set "str=%%k"
  8. setlocal enabledelayedexpansion
  9. echo=!str:*:=!|findstr /i /b  "!z!" 1>nul && set aaa=1
  10. if defined aaa (
  11. echo=&echo=&echo=
  12. echo=!str:*:=!
  13. echo=&echo=&echo=
  14. set aaa=
  15. ) else (
  16. echo=!str:*:=!
  17. )
  18. endlocal
  19. ))>"new_%%i.txt"
  20. endlocal
  21. )
  22. 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行改为
  1. 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


  
  1. @echo off
  2. rem 批处理保存为utf-8编码格式
  3. chcp 65001 >nul
  4. for /f "useback delims=" %%i in (`dir /b /a-d *.txt`) do (
  5. (for /f "useback tokens=1* delims=[]" %%a in (`find /n /v "" ^<"%%i"`) do (
  6. echo=
  7. echo=%%b
  8. ))>$
  9. move $ "%%i"
  10. )
  11. pause
复制代码

作者: kokoxx    时间: 2023-9-25 09:50

回复 11# 77七


    大佬,又来叨扰您了

请问bat能否做到查找同文件夹下的*.txt中包含有“猜你喜欢:”和“更多推荐:”的一行后,将其所在的一行替换为空行

举例:

【原版】

我是奥特曼
猜你喜欢:斗破苍穹 武动乾坤 神墓
更多推荐:斗破苍穹 武动乾坤 神墓
你也是奥特曼

【修改后效果】

我是奥特曼


你也是奥特曼
作者: Batcher    时间: 2023-9-25 10:19

回复 12# kokoxx
  1. @echo off
  2. chcp 65001 >nul
  3. cd /d "%~dp0"
  4. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  5.     echo %%i
  6.     findstr /i /v /c:"猜你喜欢:" /c:"更多推荐:" "%%i" > "%%i.ttttt"
  7.     move /y "%%i.ttttt" "%%i" >nul
  8. )
复制代码

作者: 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


  
  1. @echo off
  2. rem 批处理保存为utf-8编码格式
  3. chcp 65001 >nul
  4. for /f "useback delims=" %%i in (`dir /b /a-d *.txt`) do (
  5. setlocal
  6. for /f "useback tokens=1* delims=[]" %%a in (`find /n "猜你喜欢:" ^<"%%i"`) do (
  7. set _"%%a"=1
  8. )
  9. for /f "useback tokens=1* delims=[]" %%a in (`find /n "更多推荐:" ^<"%%i"`) do (
  10. set _"%%a"=1
  11. )
  12. (for /f "useback tokens=1* delims=[]" %%a in (`find /n /v "" ^<"%%i"`) do (
  13. if not defined _"%%a" (
  14. echo=%%b
  15. ) else (
  16. echo=
  17. )
  18. ))>$
  19. move $ "%%i"
  20. endlocal
  21. )
  22. 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


  
  1. @echo off
  2. rem 批处理保存为utf-8编码格式
  3. chcp 65001 >nul
  4. for /f "useback delims=" %%i in (`dir /b /a-d *.txt`) do (
  5. setlocal
  6. for /f "useback tokens=1* delims=[]" %%a in (`find /n ".html" ^<"%%i"`) do (
  7. for %%x in (-2 -1 0 1) do (
  8. set /a n=%%a+%%x
  9. call set _"%%n%%"=1
  10. )
  11. )
  12. (for /f "useback tokens=1* delims=[]" %%a in (`find /n /v "" ^<"%%i"`) do (
  13. if not defined _"%%a" (
  14. if defined m (
  15. echo=
  16. set m=
  17. )
  18. echo=%%b
  19. ) else (
  20. set m=1
  21. )
  22. ))>$
  23. move $ "%%i"
  24. endlocal
  25. )
  26. 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
使用变量迭代法不知是否可行。这样可以防止定义变量太多而引起的效率不高的问题:
  1. @echo off
  2. chcp 65001>nul
  3. for /f "delims=" %%I in ('dir /b /a-d *.txt') do (
  4.     setlocal enabledelayedexpansion
  5.     set n=1
  6.     (for /f "tokens=1* delims=:" %%i in ('findstr /n .* "%%I"') do (
  7.         set /a n+=1
  8.         set s1=!s2!
  9.         set s2=!s3!
  10.         set s3=%%j
  11.         if defined s3 (
  12.             set s=!s3:.html=!
  13.             if not "!s!"=="!s3!" (
  14.                 set n=0
  15.                 echo,
  16.             )
  17.         )
  18.         if !n! geq 4 echo,!s1!
  19.     )
  20.     if !n! geq 3 (
  21.         echo,!s2!
  22.         echo,!s3!
  23.     ) else if !n! equ 2 (
  24.         echo,!s3!
  25.     ))>temp
  26.     move "temp" "%%I"
  27.     endlocal
  28. )
  29. pause
复制代码
代码未经测试,可能有问题,思路应当是对的。
作者: qixiaobin0715    时间: 2023-9-27 17:30

本帖最后由 qixiaobin0715 于 2023-9-27 20:35 编辑

回复 22# kokoxx
行数过多的话可以这样写比较简洁一些:
  1. for /l %%i in (-4,1,2) do (...
复制代码

作者: qixiaobin0715    时间: 2023-9-28 16:20

回复 18# kokoxx
  1. @echo off
  2. chcp 65001>nul
  3. set /a _"猜你喜欢"=_"更多推荐"=1
  4. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  5.     (for /f "tokens=1,2* delims=::" %%a in ('findstr /n .* "%%i"') do (
  6.         if defined _"%%b" (
  7.             echo,
  8.         ) else (
  9.             if "%%c"=="" (
  10.                 echo,%%b
  11.             ) else (
  12.                 echo,%%b:%%c
  13.             )
  14.         )
  15.     ))>temp
  16. move "temp" "%%i"
  17. )
  18. pause
复制代码

作者: qixiaobin0715    时间: 2023-9-28 17:09

回复 8# kokoxx
  1. @echo off
  2. chcp 65001>nul
  3. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  4.     (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%%i"') do (
  5.         if "%%b"=="" (
  6.             echo,
  7.         ) else (
  8.             for /f "tokens=1,2* delims=0123456789 " %%j in ("%%b") do (
  9.                 if "%%j%%k"=="第章" (
  10.                     if "%%l"=="此行不做添加空行处理" (
  11.                         echo,%%b
  12.                     ) else (
  13.                         echo,
  14.                         echo,
  15.                         echo,
  16.                         echo,%%b
  17.                         echo,
  18.                         echo,
  19.                         echo,
  20.                     )
  21.                 ) else (
  22.                     echo,%%b
  23.                 )
  24.             )
  25.         )
  26.     ))>temp
  27. move "temp" "%%i"
  28. )
  29. pause
复制代码

作者: kokoxx    时间: 2023-12-8 19:26

回复 17# 77七


    大佬您好,时隔多日后,再度叨扰您

如果这里要求是将符合指定关键字条件(“猜你喜欢:”和“更多推荐”)的所在行直接删除,而不是将之变成一个空白行,将如何修改第14行的“echo=%%b”?
作者: 77七    时间: 2023-12-8 19:47

回复 28# kokoxx


  
  1. (for /f "useback tokens=1* delims=[]" %%a in (`find /n /v "" ^<"%%i"`) do (
  2. if not defined _"%%a" (
  3. echo=%%b
  4. )
  5. ))>$
复制代码
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
  1. 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
  1. 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


  
  1. @echo off
  2. rem 批处理保存为utf-8编码格式
  3. chcp 65001 >nul
  4. cd /d "%~dp0"
  5. set /a x=3,y=2
  6. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  7. setlocal
  8. (for /f "tokens=1* delims=[]" %%a in ('find /n /v "" ^<"%%i"') do (
  9. if "%%b" equ "" (
  10. set /a n+=1
  11. ) else if defined n (
  12. set /a m=n/x*y+n%%x
  13. set n=
  14. setlocal enabledelayedexpansion
  15. for /l %%l in (1,1,!m!) do (
  16. echo=
  17. )
  18. endlocal
  19. echo=%%b
  20. ) else (
  21. echo=%%b
  22. )
  23. ))>$
  24. move $ "%%i"
  25. endlocal
  26. )
  27. pause
复制代码

作者: kokoxx    时间: 2024-4-3 10:03

回复 32# 77七


    大佬您好,您之前写过一个脚本,用于删除txt包含特定文本(比如“标签”)的文本行附近的文本行
  1. @echo off
  2. chcp 65001 >nul
  3. for /f "useback delims=" %%i in (`dir /b /a-d *.txt`) do (
  4. setlocal
  5.             for /f "useback tokens=1* delims=[]" %%a in (`find /n "标签" ^<"%%i"`) do (
  6. for %%x in ( 0 ) do (
  7. set /a n=%%a+%%x
  8. call set _"%%n%%"=1
  9. )
  10. )
  11. (for /f "useback tokens=1* delims=[]" %%a in (`find /n /v "" ^<"%%i"`) do (
  12. if not defined _"%%a" (
  13. echo=%%b
  14. )
  15. ))>$
  16. move $ "%%i"
  17. endlocal
  18. )
  19. pause
复制代码
现在想用类似的bat写法实现

【处理前】

=== 第1章奥特曼

【处理后】

=== 第1章 奥特曼

(案例结束)

也就是将符合标准的文本行(关键词是“=== 第”)中的“章”变成“章 ”

该怎么修改?




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