search and replace in a file using windows batch programming

I have a batch file that I want to open a file and do a very simple search and replace of that file and then save (overwrite) the file it did the search and replace on.

I know how to read the first line of a file:

set /p file= < file.txt

but struggling on the batch method of reading a whole file and doing search/replace on it.


It's hard to give a definitive answer because it's not clear what you mean by very simple search and replace, but here are all the elements needed:

Reading a file

You can read a file line by line using for /f :

for /f %%a in (myfile.txt) do (
    echo %%a
)

Replace text

Here's one way I know how to replace text occurrences:

SETLOCAL ENABLEDELAYEDEXPANSION
for /f "delims=" %%a in (myfile.txt) do (
    SET s=%%a
    SET s=!s:stringtoreplace=replacementstring!
    echo !s!
)

This will output all lines of myfile.txt and replace stringtoreplace with replacementstring .

Overwrite a file

You may consider writing first into a new temporary file, and then replacing the original file with the new temporary one.

With the above examples, it's as simple as adding >>yourtempfilename.txt after the echo statements.

Filter lines of a file

If you simply want to delete some lines from a file, you may also consider the findstr command (help findstr).


Replace the filename.txt and search1/replace1 with your filename and the proper search/replace strings or text.

 Echo off
    set "textfile=filename.txt"
    set "tempfile=filenametemp.txt"
    (for /f "delims=" %%i in (%textfile%) do (
        set "line=%%i"
        setlocal enabledelayedexpansion
        set "line=!line:search1=replace1!"
        echo(!line!
        endlocal
    ))>"%tempfile%"
    del %textfile%
    rename %tempfile%  %textfile%

You can do a search and replace in a file or using a hard coded string or a regular expression using a VBScript (which can be executed by a batch script).

Here is an example of a of a search and replace using a hard coded search criteria:

<job>
<script language="JavaScript">
    var fso = new ActiveXObject("Scripting.FileSystemObject");  
    var MyFile = fso.GetFile("c:\\file.json");
    var txt = MyFile.OpenAsTextStream(1).ReadAll();
    txt = txt.replace("criteria", "replacing value");
    WScript.echo("Replaced File"+txt);
    var out = MyFile.OpenAsTextStream(2);
    out.write(txt);
</script>

Save this script in a file called replace.wsf. You can then execute the script from a batch file like this (in a Windows operating system):

pushd %~dp0
cscript c:\replace.wsf

If you need to do a search and replace based on a regular expression then I suggest looking at this example : regex search replace in batch


To add to Johan A's answer, if you want the find/replace strings to be supplied from a user input instead of hardcoded, you can write it like this.

(I also added a finalfilename variable since I wanted to leave the original file untouched and just generate a new file with the output. Just set it the same as the sourcefile name if you want it to overwrite the original)

@ECHO OFF
set "sourcefile=sourcefilename.txt"
set "tempfile=filenametemp.txt"
set "finalfilename=outputfile.txt"

ECHO Enter search term to find:
set /p search1=

ECHO Enter replacement string:
set /p replace1=

ECHO Finding  %search1%  and replacing with  %replace1%

(for /f "delims=" %%i in (%sourcefile%) do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    set "line=!line:%search1%=%replace1%!"
    echo(!line!
    endlocal
))>"%tempfile%"

:: Delete potential existing final file to avoid duplicate error when renaming
del %finalfilename%
ECHO Setting filename to  %finalfilename%
rename %tempfile%  %finalfilename%

ECHO Done
:: Pause to see messages
PAUSE