BAT替换文件中指定字符串

写了一段bat脚本,替换指定文件的特定字符串:

下面是内容: 可以放到其他BAT里面,给定变量值,goto到对应replace块。

@echo off
setlocal enabledelayedexpansion

REM orginalFile原始要操作的文件,单个文件。注:替换的文件中不能有冒号,否则结果不对。或者修改本脚本中for循环的delims=:中冒号为其他在文件中没有出现的符号,其中不能是等于号,<>需要加转义字符^,即写成delims=^<。
set orginalFile=1.jmx
REM outputFile指定替换字符串后,输出的文件
set outputFile=1_new.jmx
REM 要替换的原始字符串
set oldStr=HTTPSampler.port
REM 替换后的字符串
set newStr=HTTPSampler.port_new
REM 指定替换找到的第几个字符串,0是指全部替换
set /a number=0
goto replace


:replace
set /a i=0
for /f "tokens=* delims=:" %%i in (%orginalFile%) do (
	set "a=%%i"
	if %number% == 0 (
		set "b=!a:%oldStr%=%newStr%!"
	) else (
		set "b=!a!"
		if not "!a!" == "!a:%oldStr%=%newStr%!" (
			set /a i+=1
			if %number% == !i! (
				set "b=!a:%oldStr%=%newStr%!"
			)
		)
	)
	REM 如果某行内容为空格或多个空格,输出的到文件中的那行内容是echo is on 或者echo is off
	echo !b!>>%outputFile%
)

也可以把下面内容复制到txt中,另存为replace.bat,双击运行输入对应参数:

@echo off
setlocal enabledelayedexpansion

REM orginalFile原始要操作的文件,单个文件。注:替换的文件中不能有冒号,否则结果不对。或者修改本脚本中for循环的delims=:中冒号为其他在文件中没有出现的符号,其中不能是等于号,<>需要加转义字符^,即写成delims=^<。
set /p orginalFile=输入要修改的文件名(包含扩展名):
REM outputFile指定替换字符串后,输出的文件
set /p outputFile=输入输出文件名:
REM 要替换的原始字符串
set /p oldStr=输入要被替换的字符串:
REM 替换后的字符串
set /p newStr=输入替换的字符串:
REM 指定替换找到的第几个字符串,0是指全部替换
set /p number=输入替换找到的第几个字符串(0指全部替换):

set /a i=0
for /f "tokens=* delims=:" %%i in (%orginalFile%) do (
	set "a=%%i"
	if %number% == 0 (
		set "b=!a:%oldStr%=%newStr%!"
	) else (
		set "b=!a!"
		if not "!a!" == "!a:%oldStr%=%newStr%!" (
			set /a i+=1
			if %number% == !i! (
				set "b=!a:%oldStr%=%newStr%!"
			)
		)
	)
	REM 如果某行内容为空格或多个空格,输出的到文件中的那行内容是echo is on 或者echo is off
	echo !b!>>%outputFile%
)

#######################################################################

2022-05-25 更新:

保留某行为空白行,或某行内容只有空格。bat脚本如下:

@echo off
setlocal enabledelayedexpansion
 
REM orginalFile原始要操作的文件,单个文件。注:替换的文件中不能有冒号,否则结果不对。或者修改本脚本中for循环的delims=:中冒号为其他在文件中没有出现的符号,其中不能是等于号,<>需要加转义字符^,即写成delims=^<。
set orginalFile=test.txt
REM outputFile指定替换字符串后,输出的文件
set outputFile=test_new.txt
REM 要替换的原始字符串
set oldStr=Lee
REM 替换后的字符串
set newStr=Lee_New
REM 指定替换找到的第几个字符串,0是指全部替换
set /a number=0
goto replace
 
 
:replace
if exist %outputFile% del %outputFile%
set /a i=0
for /f "delims=" %%i in ('findstr /n .* %orginalFile%') do (
	set "a=%%i"
	set "a=!a:*:=!"
	if "!a!"=="" (
		set "b=!a!"
	) else (
		if %number% == 0 (
			set "b=!a:%oldStr%=%newStr%!"
		) else (
			set "b=!a!"
			if not "!a!" == "!a:%oldStr%=%newStr%!" (
				set /a i+=1
				if %number% == !i! (
					set "b=!a:%oldStr%=%newStr%!"
				)
			)
		)
	)
	REM 保留空白行,某行内容是空格或多个空格
	echo.!b!>>%outputFile%
)

测试文件内容:

good morning
this is lee
 
nice to meet you  
  

Best Regards
Lee

替换lee成Lee_New,效果如下:

good morning
this is Lee_New
 
nice to meet you  
  

Best Regards
Lee_New


版权声明:本文为lxzi101410原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。