标题: [文本处理] [已解决]批处理如何批量替换书名号中间的符号? [打印本页]
作者: DDDYJQ1 时间: 2021-1-17 21:22 标题: [已解决]批处理如何批量替换书名号中间的符号?
本帖最后由 DDDYJQ1 于 2021-1-18 22:30 编辑
请教一下如何批量替换子目录下文本文件中书名号中间的符号
《梁书.王僧辩传》
《旧五代史.汉隐帝纪下》
《史记.秦始皇本纪》
《汉书.谷永传》
《汉书.元帝纪》
《梁书?王僧辩传》
《旧五代史?汉隐帝纪下》
《史记?秦始皇本纪》
《汉书?谷永传》
《汉书?元帝纪》
...
替换成
《梁书·王僧辩传》
《旧五代史·汉隐帝纪下》
《史记·秦始皇本纪》
《汉书·谷永传》
《汉书·元帝纪》
...
不在书名内的这两个符号不替换,先谢了
作者: lancer 时间: 2021-1-17 22:15
- @echo off
- title 批量替换文件(夹)名的部分字符串
- echo.
- echo 本批处理可批量替换文件名中部分字符串,不处理子目录
- echo.
- :AA
- set str=%~dp0
- set /p "str=输入路径(直接回车,则默认批处理所在路径):"
- cd /d "%str%"
- echo. &echo 当前路径为 %str%
- :S
- setlocal enabledelayedexpansion
- echo. & echo 当要替换的文件输入为*A这种形式,且替换为空时,会自动删除字符A以前的所有字符(包含字符A)
- echo.&set /p strtemp1= 请输入要替换的文件(文件夹)名字符串(可替换空格):
- echo.&set /p strtemp2= 请输入替换后的文件(文件夹)名字符串(删除,则直接回车):
- echo.
- echo 正在修改文件(夹)名中请稍候……
- for /f "delims=" %%i in ('dir /a /b') do (
- set "f=%%~ni" ::将变量i扩展到文件名,并赋值给f
- set "k=%%~xi" ::将变量i扩展到后缀,并赋值给k
- set "f1=!f:%strtemp1%=%strtemp2%!" ::将f中的字符串1替换成字符串2,并赋值给f1
- if not "%%i"==%0 (
- if not "!f!!k!"=="!f1!!k!" (
- if exist "!f1!!k!" (
- echo 由于!f1!!k!存在同名,!f!!k! 文件名未改 ) else ren "!f!!k!" "!f1!!k!"
- )
- )
- )
- echo.
- echo 替换完成。。。。。。
- endlocal ::结束变量延迟
- echo.
- echo ===========================================================
- echo.& echo 【1】……更换路径
- echo.& echo 【2】……继续在当前目录替换
- echo.
- set /p "xuan= 请选择【1】或【2】:"
- echo.
- if %xuan% equ 1 goto AA else(
- if %xuan% equ 2 goto S
- )
- echo.&pause
复制代码
我一直在用的,替换文件名中部分字符串
作者: qixiaobin0715 时间: 2021-1-17 22:27
回复 1# DDDYJQ1
?好像不能作为文件名中的字符吧?
作者: DDDYJQ1 时间: 2021-1-17 22:45
谢谢,只是我想替换文本文件中的符号,不是文件名中的符号
作者: lancer 时间: 2021-1-17 23:16
- @echo off
- echo. & echo 注意,被处理的文本编码必须是ANSI编码方式,UTF-8编码或其他编码的文本是无法通过批处理替换其内的内容的。
- echo. & echo 输入文件名和后缀请按照(test.txt)的方式输入,本批处理不能处理多个文本,只能处理单个文本
- echo. & set /p "st=请输入要处理的文件名和后缀(例如file.txt):"
- echo. & set /p "str1=请输入想要替换的内容(可替换空格,部分特殊符号替换失败,需要在符号前加^):"
- echo. & set /p "str2=请输入替换后的内容(直接回车,则是删除文本):"
- echo. & echo 在替换中,请稍等。。。。。。
- (for /f "delims=" %%i in (%st%) do (
- set str=%%i
- call call set "str3=%%%%str:%%str1%%=%%str2%%%%%%"
- call echo %%str3%%
- )
- )>>"%st:~,-4% 副本.txt"
- echo. & echo 替换完成,已在批处理所在目录保存为副本
- echo. & pause
复制代码
是我搞错了你的需求,我以为你要处理的是文件名,原来要处理的是文本中的内容。对于文本中的内容,其实最好直接用查找替换。
上面的代码是针对单个文本的,稍后我会贴出针对多个文本的批量处理代码
注意被处理的文本必须是ANSI编码方式,要不然是会出现乱码的
作者: lancer 时间: 2021-1-17 23:21
- @echo off
- echo. & echo 注意,被处理的文本编码必须是ANSI编码方式,UTF-8编码或其他编码的文本是无法通过批处理替换其内的内容的。
- echo. & echo 本批处理可以一次性处理多个文件,处理后的文本会生成副本文件,原文件不会删除
- echo. & echo 本批处理默认处理txt文本,不需要指定格式
- echo. & set /p "str1=请输入被替换字符串:"
- echo. & set /p "str2=替换为:"
- echo. & echo 正在替换中,请稍等。。。。。。
- for /f "delims=" %%i in ('dir /b *.txt') do (
- (for /f "delims=" %%j in (%%i) do (
- set "str3=%%j"
- call call set "str4=%%%%str3:%%str1%%=%%str2%%%%%%"
- call echo %%str4%%
- )
- )>>"%%~ni 副本.txt"
- )
- echo. & echo 替换完成,已在批处理所在目录生成新的副本文件
- 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,与该脚本放到同一目录下。- @echo off
- @REM 功能:将当前目录下的.txt文件替换分隔符,例如 《汉书.元帝纪》 替换为 《汉书·元帝纪》
- cd /d "%~dp0"
- @REM 指定sed.exe路径
- set sed=".\sed.exe"
- if not exist %sed% echo sed.exe not exist.& exit /b
- @REM 替换后的文件目录
- set outputDir=".\替换后\"
- @REM 替换后的分隔符
- set separator=·
- if not exist %outputDir% md %outputDir%
- @REM gb2312 codepage
- for /f "delims=" %%A in ('dir /a-d /b *.txt') do (
- >"%outputDir%%%~nxA" %sed% --locale=zh_cn -b -E -e "s/(《[[:alnum:]]*)[^[:alnum:]《》]+([[:alnum:]]*》)/\1%separator%\2/g" "%%A"
- )
- pause
- exit /b
复制代码
作者: Gin_Q 时间: 2021-1-18 08:50
本帖最后由 Gin_Q 于 2021-1-18 09:23 编辑
回复 1# DDDYJQ1
你的文件是没有后缀名的吗?- # coding=utf-8
- # python3.7.0
-
- import os
- import re
-
- # fileList = os.listdir()
- # print(fileList)
-
- # 文件名没有后缀名的列子
- with open('2.txt') as f:
- fileList = f.readlines()
-
- pattern = re.compile(r'.|\?')
- for name in fileList:
- res = pattern.search(name)
- if res:
- dst = name.replace(res.group(0), "·")
- print(f'{name}更改为{dst}')
- # os.rename(name, dst)
-
- # 运行结果
- '''
-
- 《史记.秦始皇本纪》
- 更改为《史记·秦始皇本纪》
-
- 《汉书.谷永传》
- 更改为《汉书·谷永传》
-
- 《汉书.元帝纪》
- 更改为《汉书·元帝纪》
-
- 《梁书?王僧辩传》
- 更改为《梁书·王僧辩传》
-
- 《旧五代史?汉隐帝纪下》
- 更改为《旧五代史·汉隐帝纪下》
-
- 《史记?秦始皇本纪》
- 更改为《史记·秦始皇本纪》
-
- 《汉书?谷永传》
- 更改为《汉书·谷永传》
-
- 《汉书?元帝纪》更改为《汉书·元帝纪》
- '''
复制代码
作者: 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://www.bathome.net/) |
Powered by Discuz! 7.2 |