powershell - 使用文件名查找和替换某些字符之间的文本
问题描述
用文件名查找和替换某些字符之间的文本,大约有 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
解决方案
使用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是否确实存在于批处理文件的目录中,如果不是,则输出错误消息,停止脚本执行以使用户可以阅读该错误消息,然后退出。请参阅GOTO :EOF 返回到哪里?
命令FOR在指定目录中搜索C:\Temp
与通配符模式匹配的非隐藏文件,*.txt
并为每个找到的文本文件调用批处理文件JREPL.BAT以替换最后一个 /
和第一个字符串之间的文件名.
,其中一个或多个字符不是点或逗号,下一个字符为(= 文件扩展名和逗号)在以当前 *.txt 文件的文件名开头的行上区分大小写,不带文件扩展名,
。因此,现有文件中的文件名在文件扩展名之前的文件名中也可以包含一个或多个。location000:/
newlocation000:/
.
也适用于 FAT 驱动器的解决方案使用命令DIR获取捕获的 *.txt 文件列表,其中仅包含文件名和文件扩展名而没有路径,FOR逐行处理此文件名列表,即逐个文件名。因此,在运行FOR调用JREPL.BAT时,要处理的 *.txt 文件列表不会改变,因为直接使用FOR在 FAT 驱动器上查找 *.txt 文件就是这种情况。
NTFS 返回与通配符模式匹配的目录条目列表,按字母顺序排序,因此在这种情况下,*.txt 文件列表在FOR迭代期间不会修改。但是所有 FAT 文件系统都根据目录中的最后修改返回与通配符模式匹配的目录条目列表,最后修改的文件位于列表末尾。因此,虽然FOR从文件系统中使用一个接一个的文件名并使用修改for %%I in ("C:\Temp\*.txt") do
文件的调用jrepl.bat
来处理文件,但 FAT 驱动器上的文件列表会发生变化,并且下一个目录条目在搜索时返回给FOR*.txt
是刚刚修改的文件(= 无限循环),或者是跳过一个文件后的另一个文件,该文件也应该被修改,因为自FOR上次目录访问以来文件列表已更改。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
call /?
...还解释了%~dp0
...参数0的驱动器和路径是批处理文件本身。dir /?
echo /?
for /?
goto /?
if /?
pause /?
jrepl.bat /?
推荐阅读
- python - azure Web 应用程序服务 (PYTHON) 失败,因为 azure-iothub-device-client 的 pip 失败
- php - 直接将大型 URL 发布/粘贴到 tinymce 编辑器中,无法响应
- java-8 - 嵌套地图上的 Java8 流操作 - 地图
> - linux - 多行粘贴 (ctrl-r) 到 ex 或搜索|用 \r 替换 ^M
- javascript - NVDA 不会在单个网页上读取多个 aria-live 标签。
- sql - SQL Server 2014 内部联接不起作用
- r - 如何在 R 中绘制具有不同颜色和标记的 60x2 矩阵?
- octave - 为什么符号函数在八度音阶中显示为“0”?
- linux - QFileDialog:是否可以仅过滤可执行文件(在 Linux 下)?
- c# - 为什么不安全的代码上下文[与指针操作相关]是 C# 中的安全风险?