我正在尝试在出现多次的文件中查找“ tenant_id = 1234”并替换为“ tenant_id = 649”。我发现以下代码,但是在变量中添加= / space时无法替换。我也尝试过转义字符,但有些却不起作用。请让我知道如何使用.bat文件中的批处理脚本实现此要求。
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "INTEXTFILE=test.txt"
set "OUTTEXTFILE=test_out.txt"
set "SEARCHTEXT=tenant_id ^= 1234"
set "REPLACETEXT=tenant ^= 123456"
echo %SEARCHTEXT%
echo %REPLACETEXT%
for /f "delims=" %%A in ('type "%INTEXTFILE%"') do (
set "string=%%A"
set "modified=!string:%SEARCHTEXT%=%REPLACETEXT%!"
echo !modified!>>"%OUTTEXTFILE%"
)
del "%INTEXTFILE%"
rename "%OUTTEXTFILE%" "%INTEXTFILE%"
endlocal
答案 0 :(得分:2)
Windows7 +包含带有基于RegEx的-replace
运算符的PowerShell,
因此您可以直接使用它,也可以将它作为工具从批处理中调用。
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "INTEXTFILE=test.txt"
set "SEARCHTEXT=tenant_id = 1234"
set "REPLACETEXT=tenant = 123456"
powershell -NoP -C "(Get-Content $ENV:INTEXTFILE) -Replace $ENV:SEARCHTEXT,$ENV:REPLACETEXT|Set-Content $ENV:INTEXTFILE"
如果TEXT包含字符.*()^$[]
,这些字符将被解释为RE,
您可以切换到.Replace()
方法(需要PSv3 +)
powershell -NoP -C "(Get-Content $ENV:INTEXTFILE).Replace($ENV:SEARCHTEXT,$ENV:REPLACETEXT)|Set-Content $ENV:INTEXTFILE"
或使用[RegEx] :: Escape()自动转义文本
powershell -NoP -C "(Get-Content $ENV:INTEXTFILE) -Replace [RegEx]::Escape($ENV:SEARCHTEXT),$ENV:REPLACETEXT|Set-Content $ENV:INTEXTFILE"
答案 1 :(得分:1)
使用由 Dave Benham 编写的JREPL.BAT(这是一个批处理文件/ JScript混合程序,可以使用JScript在文件上运行正则表达式替换),这是一项易于实现的任务。
@echo off
if not exist "test.txt" goto :EOF
if not exist "%~dp0jrepl.bat" goto :EOF
call "%~dp0jrepl.bat" "(tenant_id *= *)1234" "$1649" /F "test.txt" /O -
批处理文件首先检查是否完全存在要修改的文件,如果此条件不成立,则立即退出,请参见Where does GOTO :EOF return to?
批处理文件 JREPL.BAT 必须与具有上述代码的批处理文件存储在同一目录中。因此,该批处理文件将检查 JREPL.BAT 是否确实存在于该批处理文件的目录中,如果此条件不成立,则退出。
正则表达式搜索字符串的含义是:
(
... )
...找到一个用$1
替换字符串所引用的字符串,以使发现的字符串的这一部分不修改,始于tenant_id
...区分大小写的字符串tenant_id
*
...带有0个或多个空格=
...和等号 *
...以及0或多个空格1234
...和字符1234
。替换字符串反向引用找到的字符串,从tenant_id
开始,在数字1234
之前以$1
结束,并将1234
替换为649
。
也可以在搜索字符串中使用正则表达式\d+
而不是1234
来查找具有一位或多位数字的任何数字。
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
call /?
...也解释了%~dp0
...驱动器和参数0的路径,该参数和批处理文件路径始终以反斜杠结尾。echo /?
goto /?
if /?
jrepl.bat /?