Can anyone tell me using batch file in windows ...how to read from a file and replace string=bath
from file containing=bath Abath Bbath XYZbathABC
with string hello
so that the output is like hello Ahello Bhello XYZhelloABC

- 8,093
- 8
- 50
- 76

- 1,748
- 3
- 18
- 32
7 Answers
Expanding from Andriy M, and yes you can do this from a file, even one with multiple lines
@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
EDIT
Thanks David Nelson, I have updated the script so it doesn't have the hard coded values anymore.
-
1its nice and it works, but it does strip out blank lines for some reason. Gonzalezea's answer at the following link fixes the blank line stripping issue: http://stackoverflow.com/a/20227248/280109 – user280109 Oct 19 '14 at 19:25
-
1Some information for readers thinking about using the code: __FOR__ ignores empty lines and with this code also lines starting with `;` because of being the default for option `eol`. Lines with one or more `!` are not processed correct with this code because of enabled delayed expansion required by this code. __ECHO__ outputs `echo is off.` in case of environment variable `modified` is deleted because the replace string is an empty string and the search string matches the entire line. The search string can't contain an equal sign because of `=` has a special meaning in substitution expression. – Mofi Aug 25 '18 at 10:06
-
Is this code very different if I need to change two separate string like using another `set "modified1=...`? – zygimantus Sep 07 '18 at 17:49
-
Wow, this seems to be overkill for such a simple thing. – Soerendip Dec 18 '18 at 20:14
SET string=bath Abath Bbath XYZbathABC
SET modified=%string:bath=hello%
ECHO %string%
ECHO %modified%
EDIT
Didn't see at first that you wanted the replacement to be preceded by reading the string from a file.
Well, with a batch file you don't have much facility of working on files. In this particular case, you'd have to read a line, perform the replacement, then output the modified line, and then... What then? If you need to replace all the ocurrences of 'bath' in all the file, then you'll have to use a loop:
@ECHO OFF
SETLOCAL DISABLEDELAYEDEXPANSION
FOR /F %%L IN (file.txt) DO (
SET "line=%%L"
SETLOCAL ENABLEDELAYEDEXPANSION
ECHO !line:bath=hello!
ENDLOCAL
)
ENDLOCAL
You can add a redirection to a file:
ECHO !line:bath=hello!>>file2.txt
Or you can apply the redirection to the batch file. It must be a different file.
EDIT 2
Added proper toggling of delayed expansion for correct processing of some characters that have special meaning with batch script syntax, like !
, ^
et al. (Thanks, jeb!)

- 76,112
- 17
- 94
- 154
-
OK, so at least for a string, it's possible with Windows batch features (not compatible with DOS batch or older Windows versions). But I'd be surprised if this works on a file (especially a file with multiple lines). – schnaader Mar 11 '11 at 14:30
-
1@schnaader: It is possible, try a look at [Batch FindAndReplace](http://www.dostips.com/DtCodeBatchFiles.php#Batch.FindAndReplace) – jeb Mar 11 '11 at 15:05
-
@jeb: OK, so it's possible at least, thanks for the link. Anyway, both "very complicated" and "incompatible" from my answer apply here. – schnaader Mar 11 '11 at 15:09
-
1@schnaader: Generally, it's not as elegant as some other scripting tools might do. I suspect, that initially they were called *batch* files simply meaning *batch executing* (of commands). But I may be wrong there. Anyway, what with `cscript` and `PowerShell` being there, I sometimes think they would have scrapped batch files altogether if it were not for the probably enormous number of scripts still in use all over the Windows realm. – Andriy M Mar 11 '11 at 15:24
-
@Andriy M: It can be improved to be safe with `!` and `^` in the content with toggling the delayed expansion on and off, like in [Improved BatchSubstitute](http://www.dostips.com/forum/viewtopic.php?f=3&t=1516) – jeb Mar 11 '11 at 20:06
-
@jeb: You mean, using double quotes with the assignment, and toggling the delayed expansion around the `ECHO` line only? The other measures taken in the batch script by your link seem to only have to do with parametrising the searched and replaced strings. – Andriy M Mar 11 '11 at 20:22
-
@Andriy M: No, the point is to disable it when the for-loop variable %%a is expanded and enable then the delayed expansion, for every single loop, else `!` are lost – jeb Mar 11 '11 at 20:48
-
@jeb: Seems clear now. But it would be great if you take a look at the correction, just to make sure if I got that right. Thank you very much anyway! – Andriy M Mar 11 '11 at 21:04
-
@Andriy M: It's perfect safe now, only a typo is left at %%L instead of %%a (and I can't edit it) – jeb Mar 11 '11 at 21:07
To avoid blank line skipping (give readability in conf file) I combine aflat and jeb answer (here) to something like this:
@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%

- 1
- 1

- 472
- 3
- 7
-
you may also want to set the correct code-page, to avoid problems with non-ansi characters in the text-file: e.g. `chcp 65001` for UTF8: see [Echo UTF-8 characters in windows batch](http://stackoverflow.com/a/31770411/1041641) – TmTron Dec 12 '16 at 18:00
To avoid problems with the batch parser (e.g. exclamation point), look at Problem with search and replace batch file.
Following modification of aflat's script will include special characters like exclamation points.
@echo off
setlocal DisableDelayedExpansion
set INTEXTFILE=test.txt
set OUTTEXTFILE=test_out.txt
set SEARCHTEXT=bath
set REPLACETEXT=hello
set OUTPUTLINE=
for /f "tokens=1,* delims=¶" %%A in ( '"type %INTEXTFILE%"') do (
SET string=%%A
setlocal EnableDelayedExpansion
SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%!
>> %OUTTEXTFILE% echo(!modified!
endlocal
)
del %INTEXTFILE%
rename %OUTTEXTFILE% %INTEXTFILE%
I have made a function for that, you only call it in a batch program within needing to code more.
The working is basically the same as the others, as it's the best way to do it.
Here's the link where I have that function

- 712
- 5
- 18
To avoid blank line skipping just replace this:
echo !modified! >> %OUTTEXTFILE%
with this:
echo.!modified! >> %OUTTEXTFILE%

- 9
- 1
If you have Ruby for Windows,
C:\>more file
bath Abath Bbath XYZbathABC
C:\>ruby -pne "$_.gsub!(/bath/,\"hello\")" file
hello Ahello Bhello XYZhelloABC

- 25,121
- 5
- 44
- 52