A fantastic write-up for a batch file, DOS Batch – Find and Replace, that allows string substitution in a text file. It parses each line of a text file for a particular string and replaces it with another string. For example, to replace all occurrences of “red” in “color.txt” with “blue” and put the output on the screen. The script is called BatchSubstitute.bat.
BatchSubstitute.bat (original script)
@echo off REM -- Prepare the Command Processor -- SETLOCAL ENABLEEXTENSIONS SETLOCAL DISABLEDELAYEDEXPANSION ::BatchSubstitude - parses a File line by line and replaces a substring" ::syntax: BatchSubstitude.bat OldStr NewStr File :: OldStr [in] - string to be replaced :: NewStr [in] - string to replace with :: File [in] - file to be parsed :$changed 20100115 :$source http://www.dostips.com if "%~1"=="" findstr "^::" "%~f0"&GOTO:EOF for /f "tokens=1,* delims=]" %%A in ('"type %3|find /n /v """') do ( set "line=%%B" if defined line ( call set "line=echo.%%line:%~1=%~2%%" for /f "delims=" %%X in ('"echo."%%line%%""') do %%~X ) ELSE echo
To direct the output the screen, which is the default design, the following two possibilities exist.
BatchSubstitute.bat oldstring newstring filename.txt type filename.txt|BatchSubstitute.bat oldstring newstring
The way that it is written requires piping the output or a redirect to a new file.
BatchSubstitute.bat oldstring newstring filename.txt>newfile.txt type color.txt|BatchSubstitute.bat oldstring newstring>newfile.txt
BatchSubstitute.bat (updated script)
@echo off REM -- Prepare the Command Processor -- SETLOCAL ENABLEEXTENSIONS SETLOCAL DISABLEDELAYEDEXPANSION if /I "%~1"=="/h" goto:help if "%3"=="" goto:help if "%~1"=="" findstr "^::" "%~f0"&goto:help for /f "tokens=1,* delims=]" %%A in ('"type %3|find /n /v """') do ( set "line=%%B" if defined line ( call set "line=echo.%%line:%~1=%~2%%" for /f "delims=" %%X in ('"echo."%%line%%""') do %%~X >> %3_new ) ELSE echo. ) move /Y %3_new %3 >nul goto:eof :help echo BatchSubstitude - parses a File line by line and replaces a substring echo. echo Usage: %0 [oldstr] [newstr] [filename] echo. oldstr - string to be replaced echo. newstr - string to replace with echo. filname - file to be parsed echo. goto:eof :eof
However, a little tweaking to the code will no longer require piping or output redirects. The syntax is much simpler, the original file will be overwritten with the new strings.
BatchSubstitute.bat oldstring newstring filename.txt
A special note from the original article. There are known restrictions that apply. Lines starting with “]” character will end up empty, oldstrinr must not start with “*”, and lines must not contain any of the following characters within a quoted string: “&<>|^”,