Board logo

标题: [文本处理] [已解决]批处理如何批量替换书名号中间的符号? [打印本页]

作者: DDDYJQ1    时间: 2021-1-17 21:22     标题: [已解决]批处理如何批量替换书名号中间的符号?

本帖最后由 DDDYJQ1 于 2021-1-18 22:30 编辑

请教一下如何批量替换子目录下文本文件中书名号中间的符号
《梁书.王僧辩传》
《旧五代史.汉隐帝纪下》
《史记.秦始皇本纪》
《汉书.谷永传》
《汉书.元帝纪》
《梁书?王僧辩传》
《旧五代史?汉隐帝纪下》
《史记?秦始皇本纪》
《汉书?谷永传》
《汉书?元帝纪》
...
替换成
《梁书·王僧辩传》
《旧五代史·汉隐帝纪下》
《史记·秦始皇本纪》
《汉书·谷永传》
《汉书·元帝纪》
...
不在书名内的这两个符号不替换,先谢了
作者: lancer    时间: 2021-1-17 22:15

  1. @echo off
  2. title 批量替换文件(夹)名的部分字符串
  3. echo.
  4. echo 本批处理可批量替换文件名中部分字符串,不处理子目录
  5. echo.
  6. :AA
  7. set str=%~dp0
  8. set /p "str=输入路径(直接回车,则默认批处理所在路径):"
  9. cd /d "%str%"
  10. echo. &echo 当前路径为 %str%
  11. :S
  12. setlocal enabledelayedexpansion
  13. echo. & echo 当要替换的文件输入为*A这种形式,且替换为空时,会自动删除字符A以前的所有字符(包含字符A)
  14. echo.&set /p strtemp1= 请输入要替换的文件(文件夹)名字符串(可替换空格):
  15. echo.&set /p strtemp2= 请输入替换后的文件(文件夹)名字符串(删除,则直接回车):
  16. echo.
  17. echo 正在修改文件(夹)名中请稍候……
  18. for /f "delims=" %%i in ('dir /a /b') do (
  19. set "f=%%~ni" ::将变量i扩展到文件名,并赋值给f
  20. set "k=%%~xi" ::将变量i扩展到后缀,并赋值给k
  21. set "f1=!f:%strtemp1%=%strtemp2%!" ::将f中的字符串1替换成字符串2,并赋值给f1
  22. if not "%%i"==%0 (
  23. if not "!f!!k!"=="!f1!!k!" (
  24. if exist "!f1!!k!" (
  25. echo 由于!f1!!k!存在同名,!f!!k! 文件名未改 ) else ren "!f!!k!" "!f1!!k!"
  26. )
  27. )
  28. )
  29. echo.
  30. echo 替换完成。。。。。。
  31. endlocal ::结束变量延迟
  32. echo.
  33. echo ===========================================================
  34. echo.& echo 【1】……更换路径
  35. echo.& echo 【2】……继续在当前目录替换
  36. echo.
  37. set /p "xuan= 请选择【1】或【2】:"
  38. echo.
  39. if %xuan% equ 1 goto AA else(
  40.     if %xuan% equ 2 goto S
  41. )
  42. echo.&pause
复制代码
我一直在用的,替换文件名中部分字符串
作者: qixiaobin0715    时间: 2021-1-17 22:27

回复 1# DDDYJQ1
?好像不能作为文件名中的字符吧?
作者: DDDYJQ1    时间: 2021-1-17 22:45

谢谢,只是我想替换文本文件中的符号,不是文件名中的符号
作者: lancer    时间: 2021-1-17 23:16

  1. @echo off
  2. echo. & echo 注意,被处理的文本编码必须是ANSI编码方式,UTF-8编码或其他编码的文本是无法通过批处理替换其内的内容的。
  3. echo. & echo 输入文件名和后缀请按照(test.txt)的方式输入,本批处理不能处理多个文本,只能处理单个文本
  4. echo. & set /p "st=请输入要处理的文件名和后缀(例如file.txt):"
  5. echo. & set /p "str1=请输入想要替换的内容(可替换空格,部分特殊符号替换失败,需要在符号前加^):"
  6. echo. & set /p "str2=请输入替换后的内容(直接回车,则是删除文本):"
  7. echo. & echo 在替换中,请稍等。。。。。。
  8. (for /f "delims=" %%i in (%st%) do (
  9. set str=%%i
  10. call call set "str3=%%%%str:%%str1%%=%%str2%%%%%%"
  11. call echo %%str3%%
  12. )
  13. )>>"%st:~,-4% 副本.txt"
  14. echo. & echo 替换完成,已在批处理所在目录保存为副本
  15. echo. & pause
复制代码
是我搞错了你的需求,我以为你要处理的是文件名,原来要处理的是文本中的内容。对于文本中的内容,其实最好直接用查找替换。
上面的代码是针对单个文本的,稍后我会贴出针对多个文本的批量处理代码
注意被处理的文本必须是ANSI编码方式,要不然是会出现乱码的
作者: lancer    时间: 2021-1-17 23:21

  1. @echo off
  2. echo. & echo 注意,被处理的文本编码必须是ANSI编码方式,UTF-8编码或其他编码的文本是无法通过批处理替换其内的内容的。
  3. echo. & echo 本批处理可以一次性处理多个文件,处理后的文本会生成副本文件,原文件不会删除
  4. echo. & echo 本批处理默认处理txt文本,不需要指定格式
  5. echo. & set /p "str1=请输入被替换字符串:"
  6. echo. & set /p "str2=替换为:"
  7. echo. & echo 正在替换中,请稍等。。。。。。
  8. for /f "delims=" %%i in ('dir /b *.txt') do (
  9. (for /f "delims=" %%j in (%%i) do (
  10. set "str3=%%j"
  11. call call set "str4=%%%%str3:%%str1%%=%%str2%%%%%%"
  12. call echo %%str4%%
  13. )
  14. )>>"%%~ni 副本.txt"
  15. )
  16. echo. & echo 替换完成,已在批处理所在目录生成新的副本文件
  17. echo. & pause
复制代码
多文件版,默认处理txt文本,每次只能替换一种字符串,批处理不会删除源文件,会直接在批处理所在目录生成副本文件。如果有多个字符串需要替换,多次处理即可。
作者: DDDYJQ1    时间: 2021-1-17 23:33

谢谢,我想处理多个子目录下的TXT文件,而且在书名号中间的符号《旧五代史·汉隐帝纪下》《旧五代史?汉隐帝纪下》,不在书名内的这两个符号就不替换,谢谢你
作者: lancer    时间: 2021-1-17 23:44

回复 7# DDDYJQ1


    你最好贴一个附件上来,手头没有测试文本,不知道你要处理的文本内到底是什么样的
作者: flashercs    时间: 2021-1-18 00:02

本帖最后由 flashercs 于 2021-1-18 13:50 编辑

下载http://bcn.bathome.net/tool/4.8/sed.exe,与该脚本放到同一目录下。
  1. @echo off
  2. @REM 功能:将当前目录下的.txt文件替换分隔符,例如 《汉书.元帝纪》 替换为 《汉书·元帝纪》
  3. cd /d "%~dp0"
  4. @REM 指定sed.exe路径
  5. set sed=".\sed.exe"
  6. if not exist %sed% echo sed.exe not exist.& exit /b
  7. @REM 替换后的文件目录
  8. set outputDir=".\替换后\"
  9. @REM 替换后的分隔符
  10. set separator=·
  11. if not exist %outputDir% md %outputDir%
  12. @REM gb2312 codepage
  13. for /f "delims=" %%A in ('dir /a-d /b *.txt') do (
  14.   >"%outputDir%%%~nxA" %sed% --locale=zh_cn -b -E -e "s/(《[[:alnum:]]*)[^[:alnum:]《》]+([[:alnum:]]*》)/\1%separator%\2/g" "%%A"
  15. )
  16. pause
  17. exit /b
复制代码

作者: Gin_Q    时间: 2021-1-18 08:50

本帖最后由 Gin_Q 于 2021-1-18 09:23 编辑

回复 1# DDDYJQ1


    你的文件是没有后缀名的吗?
  1. # coding=utf-8
  2. # python3.7.0
  3. import os
  4. import re
  5. # fileList = os.listdir()
  6. # print(fileList)
  7. # 文件名没有后缀名的列子
  8. with open('2.txt') as f:
  9.     fileList = f.readlines()
  10. pattern = re.compile(r'.|\?')
  11. for name in fileList:
  12.     res = pattern.search(name)
  13.     if res:
  14.         dst = name.replace(res.group(0), "·")
  15.         print(f'{name}更改为{dst}')
  16.         # os.rename(name, dst)
  17. # 运行结果
  18. '''
  19. 《史记.秦始皇本纪》
  20. 更改为《史记·秦始皇本纪》
  21. 《汉书.谷永传》
  22. 更改为《汉书·谷永传》
  23. 《汉书.元帝纪》
  24. 更改为《汉书·元帝纪》
  25. 《梁书?王僧辩传》
  26. 更改为《梁书·王僧辩传》
  27. 《旧五代史?汉隐帝纪下》
  28. 更改为《旧五代史·汉隐帝纪下》
  29. 《史记?秦始皇本纪》
  30. 更改为《史记·秦始皇本纪》
  31. 《汉书?谷永传》
  32. 更改为《汉书·谷永传》
  33. 《汉书?元帝纪》更改为《汉书·元帝纪》
  34. '''
复制代码

作者: DDDYJQ1    时间: 2021-1-18 20:18

我想处理多个子目录下的TXT文件,而且在书名号中间的符号《旧五代史·汉隐帝纪下》《旧五代史?汉隐帝纪下》,不在书名内的这两个符号就不替换。
作者: DDDYJQ1    时间: 2021-1-18 20:24

9楼的提示不是有效的WIN 32应用程序,本人系统XP 32位,不知该用哪个版本
作者: flashercs    时间: 2021-1-18 21:42

回复 12# DDDYJQ1
作者: DDDYJQ1    时间: 2021-1-18 22:29

谢谢,可以了,好用




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