Batch file 使用批处理脚本替换所有

Batch file 使用批处理脚本替换所有,batch-file,escaping,Batch File,Escaping,我试图在一个多次出现的文件中找到“tenant\u id=1234”并替换为“tenant\u id=649”。我找到了下面的代码,但在变量中添加=/space时无法替换。我也尝试过逃避角色,但有些人认为它不起作用。请让我知道如何使用.bat文件中的批处理脚本来实现此要求 @echo off setlocal EnableExtensions EnableDelayedExpansion set "INTEXTFILE=test.txt" set "OUTTEXTFILE=test_out.tx

我试图在一个多次出现的文件中找到“tenant\u id=1234”并替换为“tenant\u 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

这是一个很容易实现的任务,使用Dave Benham编写的是批处理文件/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 -
批处理文件首先检查要修改的文件是否存在,如果此条件不成立,则立即退出,请参阅

批处理文件JREPL.BAT必须存储在与具有上述代码的批处理文件相同的目录中。因此,批处理文件接下来检查批处理文件的目录中是否确实存在JREPL.BAT,如果此条件不正确,则退出

正则表达式搜索字符串的含义是:

  • 。。。查找在替换字符串为
    $1
    中引用的字符串,以保持查找到的字符串的这部分从
  • 租户id
    。。。区分大小写的字符串
    租户id
  • *
    。。。有0个或更多空格
  • =
    。。。和一个等号
  • *
    。。。再加上0个或更多的空格
  • 1234
    。。。以及字符
    1234
替换字符串返回引用找到的字符串,该字符串以
tenant\u id
开头,以
1234
结尾,以
1
结尾,并将
1234
替换为
649

也可以在搜索字符串中使用正则表达式
\d+
而不是
1234
,来查找包含一个或多个数字的任何数字

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • 呼叫/?
    。。。还解释了
    %~dp0
    。。。参数0的驱动器和路径,它是始终以反斜杠结尾的批处理文件路径
  • echo/?
  • goto/?
  • 如果/?
  • jrepl.bat/?

这是一项易于实现的任务,使用Dave Benham编写的批处理文件/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 -
批处理文件首先检查要修改的文件是否存在,如果此条件不成立,则立即退出,请参阅

批处理文件JREPL.BAT必须存储在与具有上述代码的批处理文件相同的目录中。因此,批处理文件接下来检查批处理文件的目录中是否确实存在JREPL.BAT,如果此条件不正确,则退出

正则表达式搜索字符串的含义是:

  • 。。。查找在替换字符串为
    $1
    中引用的字符串,以保持查找到的字符串的这部分从
  • 租户id
    。。。区分大小写的字符串
    租户id
  • *
    。。。有0个或更多空格
  • =
    。。。和一个等号
  • *
    。。。再加上0个或更多的空格
  • 1234
    。。。以及字符
    1234
替换字符串返回引用找到的字符串,该字符串以
tenant\u id
开头,以
1234
结尾,以
1
结尾,并将
1234
替换为
649

也可以在搜索字符串中使用正则表达式
\d+
而不是
1234
,来查找包含一个或多个数字的任何数字

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • 呼叫/?
    。。。还解释了
    %~dp0
    。。。参数0的驱动器和路径,它是始终以反斜杠结尾的批处理文件路径
  • echo/?
  • goto/?
  • 如果/?
  • jrepl.bat/?

Windows7+包含带基于正则表达式的
-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"
如果文本包含字符
*()^$[]
,将被解释为REs,
您可以切换到
.Replace()
方法(需要PSv3+)

或者使用[RegEx]::escape()自动转义文本


Windows7+包含带基于正则表达式的
-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"
如果文本包含字符
*()^$[]
,将被解释为REs,
您可以切换到
.Replace()
方法(需要PSv3+)

或者使用[RegEx]::escape()自动转义文本


谢谢你的解决方案。我不能将我发布的代码简单地修改为include=/space。@SaiKrishna您的“简单”代码(我自己的代码更简单,实际上只有一行)不能用于包含空行或包含一个或多个感叹号的行的文件。纯批处理文件解决方案仅使用Windows命令处理器命令,而不使用其他脚本语言(包括支持的JScript),因为Windows 95需要大量额外的代码,请参阅和。@SaiKrishna使用纯
cmd.exe
命令修改文本文件就像使用将钉子钉入硬盘一样。根据钉子的大小和形状(=要修改的绳子)和boa,也可以用线人钳将钉子打入硬板