I am writing a batch file script using Windows command-line environment and want to change each occurrence of some text in a file (ex. "FOO") with another (ex. "BAR"). What is the simplest way to do that? Any built in functions?
I am writing a batch file script using Windows command-line environment and want to change each occurrence of some text in a file (ex. "FOO") with another (ex. "BAR"). What is the simplest way to do that? Any built in functions?
If you are on Windows version that supports .Net 2.0, I would replace your shell. PowerShell gives you the full power of .Net from the command line. There are many commandlets built in as well. The example below will solve your question. I'm using the full names of the commands, there are shorter aliases, but this gives you something to Google for.
(Get-Content test.txt) | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt
Just used FART ("F ind A nd R eplace T ext" command line utility):
excellent little freeware for text replacement within a large set of files.
The setup files are on SourceForge.
Usage example:
fart.exe -p -r -c -- C:\tools\perl-5.8.9\* @@APP_DIR@@ C:\tools
will preview the replacements to do recursively in the files of this Perl distribution.
Only problem: the FART website icon isn't exactly tasteful, refined or elegant ;)
Update 2017 (7 years later) jagb points out in the comments to the 2011 article "FARTing the Easy Way – Find And Replace Text" from Mikail Tunç
As noted by Joe Jobs in the comments (Dec. 2020), if you want to replace &A for instance, you would need to use quotes in order to make sure & is not interpreted by the shell:
fart in.txt "&A" "B"
BatchSubstitute.bat on dostips.com is an example of search and replace using a pure batch file.
It uses a combination of FOR, FIND and CALL SET.
Lines containing characters among "&<>]|^ may be treated incorrectly.
I don't think there's a way to do it with any built-in commands. I would suggest you download something like Gnuwin32 or UnxUtils and use the sed command (or download only sed):
sed -c s/FOO/BAR/g filename
I have used perl, and that works marvelously.
perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" <fileName>
.orig is the extension it would append to the original file
For a number of files matching such as *.html
for %x in (<filePattern>) do perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" %x
Here's a solution that I found worked on Win XP. In my running batch file, I included the following:
set value=new_value
:: Setup initial configuration
:: I use && as the delimiter in the file because it should not exist, thereby giving me the whole line
::
echo --> Setting configuration and properties.
for /f "tokens=* delims=&&" %%a in (config\config.txt) do (
call replace.bat "%%a" _KEY_ %value% config\temp.txt
)
del config\config.txt
rename config\temp.txt config.txt
The replace.bat file is as below. I did not find a way to include that function within the same batch file, because the %%a variable always seems to give the last value in the for loop.
replace.bat:
@echo off
:: This ensures the parameters are resolved prior to the internal variable
::
SetLocal EnableDelayedExpansion
:: Replaces Key Variables
::
:: Parameters:
:: %1 = Line to search for replacement
:: %2 = Key to replace
:: %3 = Value to replace key with
:: %4 = File in which to write the replacement
::
:: Read in line without the surrounding double quotes (use ~)
::
set line=%~1
:: Write line to specified file, replacing key (%2) with value (%3)
::
echo !line:%2=%3! >> %4
:: Restore delayed expansion
::
EndLocal
Take a look at Is there any sed like utility for cmd.exe which asked for a sed equivalent under Windows, should apply to this question as well. Executive summary:
May be a little bit late, but I am frequently looking for similar stuff, since I don't want to get through the pain of getting software approved.
However, you usually use the FOR statement in various forms. Someone created a useful batch file that does a search and replace. Have a look here. It is important to understand the limitations of the batch file provided. For this reason I don't copy the source code in this answer.
I'm prefer to use sed from GNU utilities for Win32, the followings need to be noted
- single quote
''won't work in windows, use""insteadsed -iwon't work in windows, it will need file swapping
So the working code of sed to find and replace text in a file in windows is as below
sed -e "s/foo/bar/g" test.txt > tmp.txt && mv tmp.txt test.txt
For me, to be sure to not change the encoding (from UTF-8), keeping accents... the only way was to mention the default encoding before and after :
powershell -Command "(gc 'My file.sql' -encoding "Default") -replace 'String 1', 'String 2' | Out-File -encoding "Default" 'My file.sql'"
This is one thing that batch scripting just does not do well.
The script morechilli linked to will work for some files, but unfortunately it will choke on ones which contain characters such as pipes and ampersands.
VBScript is a better built-in tool for this task. See this article for an example: http://www.microsoft.com/technet/scriptcenter/resources/qanda/feb05/hey0208.mspx
Powershell Command -
Getting content of the file and replacing it with some other text and then storing into another file
Command -1 (Get-Content filename.xml)| ForEach-Object { $_.replace("some_text","replace_text").replace("some_other_text","replace_text") } | Set-Content filename2.xml
Copying another file into the original one file
Command2
Copy-Item -Path filename2.xml -Destination filename.xml -PassThru
removing another one file
Command 3
Remove-Item filename2.xml