使用批处理脚本替换所有内容

时间:2018-12-18 08:42:42

标签: batch-file escaping

我正在尝试在出现多次的文件中查找“ 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

2 个答案:

答案 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 /?