使用文件名查找并替换某些字符之间的文本,大约有100个文件需要此文件,因此我认为这需要出现。
原始文件名:test1.txt
内部文件用文件名替换以下两行(在每个文件中,下面的字符串可能并不紧接在后面):
location000:/computer/[project]/name/123.php,32,1,2,512,0,,txt
newlocation000:/computer/[project]/name/123.php,32,1,2,512,0,,txt
在文件test1.txt中输出
location000:/computer/[project]/name/test1.php,32,1,2,512,0,,txt
newlocation000:/computer/[project]/name/test1.php,32,1,2,512,0,,txt
答案 0 :(得分:0)
使用由 Dave Benham 编写的JREPL.BAT(这是一个批处理文件/ JScript混合程序,可以使用JScript在文件上运行正则表达式替换),这是一项易于实现的任务。
@echo off
if not exist "%~dp0jrepl.bat" (
echo ERROR: JREPL.BAT missing in directory "%~dp0".
echo/
pause
goto :EOF
)
for %%I in ("C:\Temp\*.txt") do call "%~dp0jrepl.bat" "^((?:new)?location000:/.+/).*(\.[^.,]+,)" "$1%%~nI$2" /F "%%I" /O -
此批处理文件仅在NTFS驱动器上有效。它会导致FAT16,FAT32或ExFAT驱动器上无休止的运行循环,或者跳过某些文本文件。对于独立于文件系统的有效解决方案,将最后一个命令行替换为:
for /F "eol=| delims=" %%I in ('dir "C:\Temp\*.txt" /A-D-H /B /ON 2^>nul') do call "%~dp0jrepl.bat" "^((?:new)?location000:/.+/).*(\.[^.,]+,)" "$1%%~nI$2" /F "C:\Temp\%%I" /O -
批处理文件 JREPL.BAT 必须与具有上述代码的批处理文件存储在同一目录中。因此,批处理文件首先检查 JREPL.BAT 是否确实存在于批处理文件的目录中,如果不是这样,则输出错误消息,暂停脚本执行以使用户可以使用阅读该错误消息,然后退出。参见Where does GOTO :EOF return to?
命令 FOR 在指定目录C:\Temp
中搜索与通配符模式*.txt
相匹配的非隐藏文件,并为每个找到的文本文件调用批处理文件 JREPL。 BAT 可替换以/
开头的 last .
和 first 字符串之间的文件名,其中一个或多个字符不是点或逗号,下一个字符为,
(=文件扩展名和逗号),在行上以大小写区分大小写,以{* 1。}或location000:/
开头,并以当前* .txt文件的文件名开头没有文件扩展名。因此,现有文件中的文件名还可以在文件扩展名前包含一个或多个newlocation000:/
。
还可以在FAT驱动器上使用的解决方案使用命令 DIR 获取* .txt文件的捕获列表,该列表仅包含文件名和文件扩展名,而没有路径和 FOR 逐行处理此文件名列表,即按文件名列出文件名。因此,在运行 FOR 调用 JREPL.BAT 时,要处理的* .txt文件列表不会更改,就像使用 FOR 时一样直接在FAT驱动器上查找* .txt文件。
NTFS返回与按字母顺序排序的通配符模式匹配的目录条目的列表,因此在这种情况下,*。txt文件的列表在 FOR 迭代期间不会修改。但是,所有FAT文件系统都根据目录中的最后修改返回匹配通配符模式的目录条目列表,列表的最后一个修改文件。因此,尽管 FOR 在文件系统中使用.
后得到一个文件名,并通过调用for %%I in ("C:\Temp\*.txt") do
处理该文件来修改该文件,但FAT驱动器上的文件列表会更改在搜索jrepl.bat
时返回到 FOR 的下一个目录条目是刚修改的文件(=无限循环)还是跳过文件后又由于文件列表而也要修改的另一个文件自 FOR 访问上次目录以来更改。
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
*.txt
...也解释了call /?
...参数0的驱动器和路径是批处理文件本身。%~dp0
dir /?
echo /?
for /?
goto /?
if /?
pause /?