谁能告诉我使用批处理文件在Windows ...如何从文件中读取并替换字符串= bath从包含文件= bath Abath Bbath XYZbathABC用绳子hello使输出像hello Ahello Bhello XYZhelloABC
afl*_*lat 95
从Andriy M扩展,是的,您可以从文件中执行此操作,即使是具有多行的文件也是如此
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "INTEXTFILE=test.txt"
set "OUTTEXTFILE=test_out.txt"
set "SEARCHTEXT=bath"
set "REPLACETEXT=hello"
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
Run Code Online (Sandbox Code Playgroud)
编辑
感谢David Nelson,我更新了脚本,因此它不再具有硬编码值.
And*_*y M 41
SET string=bath Abath Bbath XYZbathABC
SET modified=%string:bath=hello%
ECHO %string%
ECHO %modified%
Run Code Online (Sandbox Code Playgroud)
编辑
一开始没有看到你想要在替换之前从文件中读取字符串.
好吧,对于批处理文件,您没有太多处理文件的工具.在这种特殊情况下,您必须读取一行,执行替换,然后输出修改后的行,然后......那么呢?如果你需要在所有文件中替换'bath'的所有发生,那么你将不得不使用一个循环:
@ECHO OFF
SETLOCAL DISABLEDELAYEDEXPANSION
FOR /F %%L IN (file.txt) DO (
SET "line=%%L"
SETLOCAL ENABLEDELAYEDEXPANSION
ECHO !line:bath=hello!
ENDLOCAL
)
ENDLOCAL
Run Code Online (Sandbox Code Playgroud)
您可以向文件添加重定向:
ECHO !line:bath=hello!>>file2.txt
Run Code Online (Sandbox Code Playgroud)
或者,您可以将重定向应用于批处理文件.它必须是不同的文件.
编辑2
添加了适当的延迟扩展切换,以便正确处理具有批处理脚本语法特殊含义的某些字符,例如!,^et al.(谢谢,杰布!)
小智 12
为了避免空行跳过(在conf文件中提供可读性),我将aflat和jeb的答案(这里)结合起来:
@echo off
setlocal enabledelayedexpansion
set INTEXTFILE=test.txt
set OUTTEXTFILE=test_out.txt
set SEARCHTEXT=bath
set REPLACETEXT=hello
set OUTPUTLINE=
for /f "tokens=1,* delims=¶" %%A in ( '"findstr /n ^^ %INTEXTFILE%"') do (
SET string=%%A
for /f "delims=: tokens=1,*" %%a in ("!string!") do set "string=%%b"
if "!string!" == "" (
echo.>>%OUTTEXTFILE%
) else (
SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%!
echo !modified! >> %OUTTEXTFILE%
)
)
del %INTEXTFILE%
rename %OUTTEXTFILE% %INTEXTFILE%
Run Code Online (Sandbox Code Playgroud)