¿Cómo puede encontrar y reemplazar texto en un archivo usando el entorno de línea de comandos de Windows?

Estoy escribiendo un script de archivo por lotes utilizando el entorno de línea de comandos de Windows y quiero cambiar cada aparición de texto en un archivo (por ejemplo, “FOO”) con otro (por ejemplo, “BAR”). ¿Cuál es la forma más simple de hacer eso? ¿Alguna función incorporada?

Si tiene una versión de Windows que admita .Net 2.0, reemplazaría su shell. PowerShell le proporciona toda la potencia de .Net desde la línea de comandos. También hay muchos comandos integrados. El siguiente ejemplo resolverá tu pregunta. Estoy usando los nombres completos de los comandos, hay alias más cortos, pero esto le da algo a Google.

(Get-Content test.txt) | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt 

Muchas de las respuestas aquí me ayudaron a orientarme en la dirección correcta, sin embargo, ninguna fue adecuada para mí, así que estoy publicando mi solución.

Tengo Windows 7, que viene con PowerShell incorporado. Aquí está el script que solía encontrar / reemplazar todas las instancias de texto en un archivo:

 powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | Out-File myFile.txt" 

Para explicarlo:

  • powershell inicia powershell.exe, que está incluido en Windows 7
  • -Command "... " es una línea de comando arg para powershell.exe que contiene el comando para ejecutar
  • (gc myFile.txt) lee el contenido de myFile.txt ( gc es la abreviatura del comando Get-Content )
  • -replace 'foo', 'bar' simplemente ejecuta el comando replace para reemplazar foo con bar
  • | Out-File myFile.txt | Out-File myFile.txt canaliza el resultado al archivo myFile.txt

Powershell.exe ya debe ser parte de tu statement PATH, pero si no, puedes agregarlo. La ubicación de esta en mi máquina es C:\WINDOWS\system32\WindowsPowerShell\v1.0

Solo utilicé la utilidad de línea de comando FART (” F ind A nd R eplace T ext”):
excelente pequeño freeware para el reemplazo de texto dentro de un gran conjunto de archivos.

Los archivos de instalación están en SourceForge .

Ejemplo de uso:

 fart.exe -p -r -c -- C:\tools\perl-5.8.9\* @@APP_DIR@@ C:\tools 

previsualizará los reemplazos para hacer recursivamente en los archivos de esta distribución de Perl.

El único problema: el icono del sitio web FART no es exactamente elegante, refinado o elegante;)


Actualización 2017 (7 años después) jagb señala en los comentarios del artículo de 2011 ” FARTing the Easy Way – Find and Replace Text ” de Mikail Tunç

Reemplazar – Reemplazar una subcadena utilizando la sustitución de cadena Descripción: Para reemplazar una subcadena con otra cadena, use la función de sustitución de cadena. El ejemplo que se muestra aquí reemplaza todas las instancias “te” errores ortográficos con “el” en la variable de cadena str.

 set str=teh cat in teh hat echo.%str% set str=%str:teh=the% echo.%str% 

Salida de script:

 teh cat in teh hat the cat in the hat 

ref: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace

Crear archivo replace.vbs:

 Const ForReading = 1 Const ForWriting = 2 strFileName = Wscript.Arguments(0) strOldText = Wscript.Arguments(1) strNewText = Wscript.Arguments(2) Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile(strFileName, ForReading) strText = objFile.ReadAll objFile.Close strNewText = Replace(strText, strOldText, strNewText) Set objFile = objFSO.OpenTextFile(strFileName, ForWriting) objFile.Write strNewText 'WriteLine adds extra CR/LF objFile.Close 

Para utilizar este script revisado (que llamaremos replace.vbs) simplemente escriba un comando similar a este desde el símbolo del sistema:

cscript replace.vbs "C:\Scripts\Text.txt" "Jim " "James "

BatchSubstitute.bat en dostips.com es un ejemplo de búsqueda y reemplazo utilizando un archivo por lotes puro.

Utiliza una combinación de FOR , FIND y CALL SET .

Las líneas que contienen caracteres entre "&<>]|^ pueden tratarse incorrectamente.


Nota : asegúrese de ver la actualización al final de esta respuesta para un enlace al JREPL.BAT superior que reemplaza a REPL.BAT.
JREPL.BAT 7.0 y versiones posteriores admiten nativamente unicode (UTF-16LE) a través de la opción /UTF , así como cualquier otro conjunto de caracteres, incluido UTF-8, a través de ADO !!!!


He escrito una pequeña utilidad híbrida JScript / batch llamada REPL.BAT que es muy conveniente para modificar archivos ASCII (o ASCII extendidos) a través de la línea de comandos o un archivo por lotes. El script nativo no requiere la instalación de ningún tercero ejecutable, y funciona en cualquier versión moderna de Windows desde XP en adelante. También es muy rápido, especialmente cuando se compara con soluciones de lotes puros.

REPL.BAT simplemente lee stdin, realiza una búsqueda y reemplazo de expresiones regulares de JScript y escribe el resultado en stdout.

Aquí hay un ejemplo trivial de cómo reemplazar foo con barra en test.txt, suponiendo que REPL.BAT está en su carpeta actual, o mejor aún, en algún lugar dentro de su RUTA:

 type test.txt|repl "foo" "bar" >test.txt.new move /y test.txt.new test.txt 

Las capacidades de expresiones regulares de JScript lo hacen muy poderoso, especialmente la capacidad del texto de reemplazo para hacer referencia a las subcadenas capturadas del texto de búsqueda.

He incluido una serie de opciones en la utilidad que lo hacen bastante poderoso. Por ejemplo, combinar las opciones M y X permite la modificación de archivos binarios. La opción M Multilínea permite realizar búsquedas en múltiples líneas. La opción de patrón de sustitución X eXtended proporciona secuencias de escape que permiten la inclusión de cualquier valor binario en el texto de reemplazo.

Toda la utilidad podría haber sido escrita como JScript puro, pero el archivo de proceso por lotes híbrido elimina la necesidad de especificar explícitamente CSCRIPT cada vez que quiera usar la utilidad.

Aquí está el script REPL.BAT. La documentación completa está integrada en el script.

 @if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment ::************ Documentation *********** ::REPL.BAT version 6.2 ::: :::REPL Search Replace [Options [SourceVar]] :::REPL /?[REGEX|REPLACE] :::REPL /V ::: ::: Performs a global regular expression search and replace operation on ::: each line of input from stdin and prints the result to stdout. ::: ::: Each parameter may be optionally enclosed by double quotes. The double ::: quotes are not considered part of the argument. The quotes are required ::: if the parameter contains a batch token delimiter like space, tab, comma, ::: semicolon. The quotes should also be used if the argument contains a ::: batch special character like &, |, etc. so that the special character ::: does not need to be escaped with ^. ::: ::: If called with a single argument of /?, then prints help documentation ::: to stdout. If a single argument of /?REGEX, then opens up Microsoft's ::: JScript regular expression documentation within your browser. If a single ::: argument of /?REPLACE, then opens up Microsoft's JScript REPLACE ::: documentation within your browser. ::: ::: If called with a single argument of /V, case insensitive, then prints ::: the version of REPL.BAT. ::: ::: Search - By default, this is a case sensitive JScript (ECMA) regular ::: expression expressed as a string. ::: ::: JScript regex syntax documentation is available at ::: http://msdn.microsoft.com/en-us/library/ae5bf541(v=vs.80).aspx ::: ::: Replace - By default, this is the string to be used as a replacement for ::: each found search expression. Full support is provided for ::: substituion patterns available to the JScript replace method. ::: ::: For example, $& represents the portion of the source that matched ::: the entire search pattern, $1 represents the first captured ::: submatch, $2 the second captured submatch, etc. A $ literal ::: can be escaped as $$. ::: ::: An empty replacement string must be represented as "". ::: ::: Replace substitution pattern syntax is fully documented at ::: http://msdn.microsoft.com/en-US/library/efy6s3e6(v=vs.80).aspx ::: ::: Options - An optional string of characters used to alter the behavior ::: of REPL. The option characters are case insensitive, and may ::: appear in any order. ::: ::: A - Only print altered lines. Unaltered lines are discarded. ::: If the S options is present, then prints the result only if ::: there was a change anywhere in the string. The A option is ::: incompatible with the M option unless the S option is present. ::: ::: B - The Search must match the beginning of a line. ::: Mostly used with literal searches. ::: ::: E - The Search must match the end of a line. ::: Mostly used with literal searches. ::: ::: I - Makes the search case-insensitive. ::: ::: J - The Replace argument represents a JScript expression. ::: The expression may access an array like arguments object ::: named $. However, $ is not a true array object. ::: ::: The $.length property contains the total number of arguments ::: available. The $.length value is equal to n+3, where n is the ::: number of capturing left parentheses within the Search string. ::: ::: $[0] is the substring that matched the Search, ::: $[1] through $[n] are the captured submatch strings, ::: $[n+1] is the offset where the match occurred, and ::: $[n+2] is the original source string. ::: ::: Arguments $[0] through $[10] may be abbreviated as ::: $1 through $10. Argument $[11] and above must use the square ::: bracket notation. ::: ::: L - The Search is treated as a string literal instead of a ::: regular expression. Also, all $ found in the Replace string ::: are treated as $ literals. ::: ::: M - Multi-line mode. The entire contents of stdin is read and ::: processed in one pass instead of line by line, thus enabling ::: search for \n. This also enables preservation of the original ::: line terminators. If the M option is not present, then every ::: printed line is terminated with carriage return and line feed. ::: The M option is incompatible with the A option unless the S ::: option is also present. ::: ::: Note: If working with binary data containing NULL bytes, ::: then the M option must be used. ::: ::: S - The source is read from an environment variable instead of ::: from stdin. The name of the source environment variable is ::: specified in the next argument after the option string. Without ::: the M option, ^ anchors the beginning of the string, and $ the ::: end of the string. With the M option, ^ anchors the beginning ::: of a line, and $ the end of a line. ::: ::: V - Search and Replace represent the name of environment ::: variables that contain the respective values. An undefined ::: variable is treated as an empty string. ::: ::: X - Enables extended substitution pattern syntax with support ::: for the following escape sequences within the Replace string: ::: ::: \\ - Backslash ::: \b - Backspace ::: \f - Formfeed ::: \n - Newline ::: \q - Quote ::: \r - Carriage Return ::: \t - Horizontal Tab ::: \v - Vertical Tab ::: \xnn - Extended ASCII byte code expressed as 2 hex digits ::: \unnnn - Unicode character expressed as 4 hex digits ::: ::: Also enables the \q escape sequence for the Search string. ::: The other escape sequences are already standard for a regular ::: expression Search string. ::: ::: Also modifies the behavior of \xnn in the Search string to work ::: properly with extended ASCII byte codes. ::: ::: Extended escape sequences are supported even when the L option ::: is used. Both Search and Replace support all of the extended ::: escape sequences if both the X and L opions are combined. ::: ::: Return Codes: 0 = At least one change was made ::: or the /? or /V option was used ::: ::: 1 = No change was made ::: ::: 2 = Invalid call syntax or incompatible options ::: ::: 3 = JScript runtime error, typically due to invalid regex ::: ::: REPL.BAT was written by Dave Benham, with assistance from DosTips user Aacini ::: to get \xnn to work properly with extended ASCII byte codes. Also assistance ::: from DosTips user penpen diagnosing issues reading NULL bytes, along with a ::: workaround. REPL.BAT was originally posted at: ::: http://www.dostips.com/forum/viewtopic.php?f=3&t=3855 ::: ::************ Batch portion *********** @echo off if .%2 equ . ( if "%~1" equ "/?" ( <"%~f0" cscript //E:JScript //nologo "%~f0" "^:::" "" a exit /b 0 ) else if /i "%~1" equ "/?regex" ( explorer "http://msdn.microsoft.com/en-us/library/ae5bf541(v=vs.80).aspx" exit /b 0 ) else if /i "%~1" equ "/?replace" ( explorer "http://msdn.microsoft.com/en-US/library/efy6s3e6(v=vs.80).aspx" exit /b 0 ) else if /i "%~1" equ "/V" ( <"%~f0" cscript //E:JScript //nologo "%~f0" "^::(REPL\.BAT version)" "$1" a exit /b 0 ) else ( call :err "Insufficient arguments" exit /b 2 ) ) echo(%~3|findstr /i "[^SMILEBVXAJ]" >nul && ( call :err "Invalid option(s)" exit /b 2 ) echo(%~3|findstr /i "M"|findstr /i "A"|findstr /vi "S" >nul && ( call :err "Incompatible options" exit /b 2 ) cscript //E:JScript //nologo "%~f0" %* exit /b %errorlevel% :err >&2 echo ERROR: %~1. Use REPL /? to get help. exit /b ************* JScript portion **********/ var rtn=1; try { var env=WScript.CreateObject("WScript.Shell").Environment("Process"); var args=WScript.Arguments; var search=args.Item(0); var replace=args.Item(1); var options="g"; if (args.length>2) options+=args.Item(2).toLowerCase(); var multi=(options.indexOf("m")>=0); var alterations=(options.indexOf("a")>=0); if (alterations) options=options.replace(/a/g,""); var srcVar=(options.indexOf("s")>=0); if (srcVar) options=options.replace(/s/g,""); var jexpr=(options.indexOf("j")>=0); if (jexpr) options=options.replace(/j/g,""); if (options.indexOf("v")>=0) { options=options.replace(/v/g,""); search=env(search); replace=env(replace); } if (options.indexOf("x")>=0) { options=options.replace(/x/g,""); if (!jexpr) { replace=replace.replace(/\\\\/g,"\\B"); replace=replace.replace(/\\q/g,"\""); replace=replace.replace(/\\x80/g,"\\u20AC"); replace=replace.replace(/\\x82/g,"\\u201A"); replace=replace.replace(/\\x83/g,"\\u0192"); replace=replace.replace(/\\x84/g,"\\u201E"); replace=replace.replace(/\\x85/g,"\\u2026"); replace=replace.replace(/\\x86/g,"\\u2020"); replace=replace.replace(/\\x87/g,"\\u2021"); replace=replace.replace(/\\x88/g,"\\u02C6"); replace=replace.replace(/\\x89/g,"\\u2030"); replace=replace.replace(/\\x8[aA]/g,"\\u0160"); replace=replace.replace(/\\x8[bB]/g,"\\u2039"); replace=replace.replace(/\\x8[cC]/g,"\\u0152"); replace=replace.replace(/\\x8[eE]/g,"\\u017D"); replace=replace.replace(/\\x91/g,"\\u2018"); replace=replace.replace(/\\x92/g,"\\u2019"); replace=replace.replace(/\\x93/g,"\\u201C"); replace=replace.replace(/\\x94/g,"\\u201D"); replace=replace.replace(/\\x95/g,"\\u2022"); replace=replace.replace(/\\x96/g,"\\u2013"); replace=replace.replace(/\\x97/g,"\\u2014"); replace=replace.replace(/\\x98/g,"\\u02DC"); replace=replace.replace(/\\x99/g,"\\u2122"); replace=replace.replace(/\\x9[aA]/g,"\\u0161"); replace=replace.replace(/\\x9[bB]/g,"\\u203A"); replace=replace.replace(/\\x9[cC]/g,"\\u0153"); replace=replace.replace(/\\x9[dD]/g,"\\u009D"); replace=replace.replace(/\\x9[eE]/g,"\\u017E"); replace=replace.replace(/\\x9[fF]/g,"\\u0178"); replace=replace.replace(/\\b/g,"\b"); replace=replace.replace(/\\f/g,"\f"); replace=replace.replace(/\\n/g,"\n"); replace=replace.replace(/\\r/g,"\r"); replace=replace.replace(/\\t/g,"\t"); replace=replace.replace(/\\v/g,"\v"); replace=replace.replace(/\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}/g, function($0,$1,$2){ return String.fromCharCode(parseInt("0x"+$0.substring(2))); } ); replace=replace.replace(/\\B/g,"\\"); } search=search.replace(/\\\\/g,"\\B"); search=search.replace(/\\q/g,"\""); search=search.replace(/\\x80/g,"\\u20AC"); search=search.replace(/\\x82/g,"\\u201A"); search=search.replace(/\\x83/g,"\\u0192"); search=search.replace(/\\x84/g,"\\u201E"); search=search.replace(/\\x85/g,"\\u2026"); search=search.replace(/\\x86/g,"\\u2020"); search=search.replace(/\\x87/g,"\\u2021"); search=search.replace(/\\x88/g,"\\u02C6"); search=search.replace(/\\x89/g,"\\u2030"); search=search.replace(/\\x8[aA]/g,"\\u0160"); search=search.replace(/\\x8[bB]/g,"\\u2039"); search=search.replace(/\\x8[cC]/g,"\\u0152"); search=search.replace(/\\x8[eE]/g,"\\u017D"); search=search.replace(/\\x91/g,"\\u2018"); search=search.replace(/\\x92/g,"\\u2019"); search=search.replace(/\\x93/g,"\\u201C"); search=search.replace(/\\x94/g,"\\u201D"); search=search.replace(/\\x95/g,"\\u2022"); search=search.replace(/\\x96/g,"\\u2013"); search=search.replace(/\\x97/g,"\\u2014"); search=search.replace(/\\x98/g,"\\u02DC"); search=search.replace(/\\x99/g,"\\u2122"); search=search.replace(/\\x9[aA]/g,"\\u0161"); search=search.replace(/\\x9[bB]/g,"\\u203A"); search=search.replace(/\\x9[cC]/g,"\\u0153"); search=search.replace(/\\x9[dD]/g,"\\u009D"); search=search.replace(/\\x9[eE]/g,"\\u017E"); search=search.replace(/\\x9[fF]/g,"\\u0178"); if (options.indexOf("l")>=0) { search=search.replace(/\\b/g,"\b"); search=search.replace(/\\f/g,"\f"); search=search.replace(/\\n/g,"\n"); search=search.replace(/\\r/g,"\r"); search=search.replace(/\\t/g,"\t"); search=search.replace(/\\v/g,"\v"); search=search.replace(/\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}/g, function($0,$1,$2){ return String.fromCharCode(parseInt("0x"+$0.substring(2))); } ); search=search.replace(/\\B/g,"\\"); } else search=search.replace(/\\B/g,"\\\\"); } if (options.indexOf("l")>=0) { options=options.replace(/l/g,""); search=search.replace(/([.^$*+?()[{\\|])/g,"\\$1"); if (!jexpr) replace=replace.replace(/\$/g,"$$$$"); } if (options.indexOf("b")>=0) { options=options.replace(/b/g,""); search="^"+search } if (options.indexOf("e")>=0) { options=options.replace(/e/g,""); search=search+"$" } var search=new RegExp(search,options); var str1, str2; if (srcVar) { str1=env(args.Item(3)); str2=str1.replace(search,jexpr?replFunc:replace); if (!alterations || str1!=str2) if (multi) { WScript.Stdout.Write(str2); } else { WScript.Stdout.WriteLine(str2); } if (str1!=str2) rtn=0; } else if (multi){ var buf=1024; str1=""; while (!WScript.StdIn.AtEndOfStream) { str1+=WScript.StdIn.Read(buf); buf*=2 } str2=str1.replace(search,jexpr?replFunc:replace); WScript.Stdout.Write(str2); if (str1!=str2) rtn=0; } else { while (!WScript.StdIn.AtEndOfStream) { str1=WScript.StdIn.ReadLine(); str2=str1.replace(search,jexpr?replFunc:replace); if (!alterations || str1!=str2) WScript.Stdout.WriteLine(str2); if (str1!=str2) rtn=0; } } } catch(e) { WScript.Stderr.WriteLine("JScript runtime error: "+e.message); rtn=3; } WScript.Quit(rtn); function replFunc($0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10) { var $=arguments; return(eval(replace)); } 

ACTUALIZACIÓN IMPORTANTE

He dejado de desarrollar REPL.BAT y lo he reemplazado con JREPL.BAT. Esta nueva utilidad tiene la misma funcionalidad de REPL.BAT, y mucho más:

  • Soporte Unicode UTF-16LE a través de capacidades nativas CSICC Unicode y cualquier otro conjunto de caracteres (incluido UTF-8) a través de ADO.
  • Lea directamente desde / escriba directamente en un archivo: no necesita pipas, redirección ni comando de movimiento.
  • Incorporar JScript proporcionado por el usuario
  • Translation facility similar a unix tr, solo que también es compatible con la búsqueda de expresiones regulares y JScript replace
  • Descartar texto no coincidente
  • Prefijo las líneas de salida con el número de línea
  • y más…

Como siempre, la documentación completa está integrada en el script.

La solución original trivial es ahora aún más simple:

 jrepl "foo" "bar" /f test.txt /o - 

La versión actual de JREPL.BAT está disponible en DosTips . Lea todas las publicaciones posteriores en el hilo para ver ejemplos de uso y un historial del desarrollo.

Use FNR

Use la utilidad fnr . Tiene algunas ventajas sobre el fart :

  • Expresiones regulares
  • GUI opcional. Tiene un “botón Generar línea de comando” para crear texto de línea de comando para colocar en el archivo por lotes.
  • Patrones multilínea: la GUI le permite trabajar fácilmente con patrones multilínea. En FART tendrías que escapar manualmente de los saltos de línea.
  • Le permite seleccionar la encoding del archivo de texto. También tiene una opción de detección automática.

Descargue FNR aquí: http://findandreplace.codeplex.com/

Ejemplo de uso: fnr --cl --dir "" --fileMask "hibernate.*" --useRegEx --find "find_str_expression" --replace "replace_string"

No creo que haya una manera de hacerlo con ningún comando incorporado. Le sugiero que descargue algo como Gnuwin32 o UnxUtils y use el comando sed (o descargue solo sed ):

 sed -cs/FOO/BAR/g filename 

Sé que llego tarde a la fiesta …

Personalmente, me gusta la solución en: – http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace

También utilizamos la función Deducar extensivamente para ayudarnos a entregar aproximadamente 500 correos electrónicos diariamente a través de SMTP desde: https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o

y ambos funcionan de forma nativa sin necesidad de herramientas o utilidades adicionales.

REEMPLAZO:

 DEL New.txt setLocal EnableDelayedExpansion For /f "tokens=* delims= " %%a in (OLD.txt) do ( Set str=%%a set str=!str:FOO=BAR! echo !str!>>New.txt ) ENDLOCAL 

DEDUPLICATOR (tenga en cuenta el uso de -9 para un número de ABA):

 REM DE-DUPLICATE THE Mapping.txt FILE REM THE DE-DUPLICATED FILE IS STORED AS new.txt set MapFile=Mapping.txt set ReplaceFile=New.txt del %ReplaceFile% ::DelDupeText.bat rem https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o setLocal EnableDelayedExpansion for /f "tokens=1,2 delims=," %%a in (%MapFile%) do ( set str=%%a rem Ref: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.RightString set str=!str:~-9! set str2=%%a set str3=%%a,%%b find /i ^"!str!^" %MapFile% find /i ^"!str!^" %ReplaceFile% if errorlevel 1 echo !str3!>>%ReplaceFile% ) ENDLOCAL 

¡Gracias!

When you work with Git on Windows then simply fire up git-bash and use sed . Or, when using Windows 10, start “Bash on Ubuntu on Windows” (from the Linux subsystem) and use sed .

Its a stream editor, but can edit files directly by using the following command:

 sed -i -e 's/foo/bar/g' filename 
  • -i option is used to edit in place on filename.
  • -e option indicates a command to run.
    • s is used to replace the found expression “foo” with “bar” and g is used to replace any found matches.

Note by ereOn:

If you want to replace a string in versioned files only of a Git repository, you may want to use:

git ls-files | xargs sed -i -e 's/foo/bar/g'

which works wonders.

I have used perl, and that works marvelously.

 perl -pi.orig -e "s///g;"  

.orig is the extension it would append to the original file

For a number of files matching such as *.html

 for %x in () do perl -pi.orig -e "s///g;" %x 

I played around with some of the existing answers here and prefer my improved solution…

 type test.txt | powershell -Command "$input | ForEach-Object { $_ -replace \"foo\", \"bar\" }" 

or if you want to save the output again to a file…

 type test.txt | powershell -Command "$input | ForEach-Object { $_ -replace \"foo\", \"bar\" }" > outputFile.txt 

The benefit of this is that you can pipe in output from any program. Will look into using regular expressions with this too. Couldn’t work out how to make it into a BAT file for easier use though… 🙁

With the replacer.bat

1) With e? option that will evaluate special character sequences like \n\r and unicode sequences. In this case will replace quoted "Foo" and "Bar" :

 call replacer.bat "e?C:\content.txt" "\u0022Foo\u0022" "\u0022Bar\u0022" 

2) Straightforward replacing where the Foo and Bar are not quoted.

 call replacer.bat "C:\content.txt" "Foo" "Bar" 

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. Resumen ejecutivo:

  • It can be done in batch file, but it’s not pretty
  • Lots of available third party executables that will do it for you, if you have the luxury of installing or just copying over an exe
  • Can be done with VBScript or similar if you need something able to run on a Windows box without modification etc.

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. Echa un vistazo aquí . 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.

Two batch files that supply search and replace functions have been written by Stack Overflow members dbenham and aacini using native built-in jscript in Windows.

They are both robust and very swift with large files compared to plain batch scripting, and also simpler to use for basic replacing of text. They both have Windows regular expression pattern matching.

======================================================================================

1) This sed-like helper batch file is called repl.bat (by dbenham) – download from: https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

Example using the L literal switch:

 echo This is FOO here|repl "FOO" "BAR" L echo and with a file: type "file.txt" |repl "FOO" "BAR" L >"newfile.txt" 

======================================================================================

2) This grep-like helper batch file is called findrepl.bat (by aacini) – download from: https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

Example which has regular expressions active:

 echo This is FOO here|findrepl "FOO" "BAR" echo and with a file: type "file.txt" |findrepl "FOO" "BAR" >"newfile.txt" 

======================================================================================

Both become powerful system-wide utilities when placed in a folder that is on the path , or can be used in the same folder with a batch file, or from the cmd prompt.

They both have case-insensitive switches and also many other functions.

Power shell command works like a charm

 ( test.txt | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt ) 

Just faced a similar problem – “Search and replace text within files”, but with the exception that for both filenames and search/repalce I need to use regex. Because I’m not familiar with Powershell and want to save my searches for later use I need something more “user friendly” (preferable if it has GUI).

So, while Googling 🙂 I found a great tool – FAR (Find And Replace) (not FART).

That little program has nice GUI and support regex for searching in filenames and within files. Only disadventage is that if you want to save your settings you have to run the program as an administrator (at least on Win7).

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

@Rachel gave an excellent answer but here is a variation of it to read content to a powershell $data variable. You may then easily manipulate content multiple times before writing to a output file. Also see how multi-line values are given in a .bat batch files.

 @REM ASCII=7bit ascii(no bom), UTF8=with bom marker set cmd=^ $old = '\$Param1\$'; ^ $new = 'Value1'; ^ [string[]]$data = Get-Content 'datafile.txt'; ^ $data = $data -replace $old, $new; ^ out-file -InputObject $data -encoding UTF8 -filepath 'datafile.txt'; powershell -NoLogo -Noninteractive -InputFormat none -Command "%cmd%" 

Download Cygwin (free) and use unix-like commands at the Windows command line.

Your best bet: sed

Use powershell in .bat – for Windows 7+

encoding utf8 is optional, good for web sites

 @echo off set ffile='myfile.txt' set fold='FOO' set fnew='BAR' powershell -Command "(gc %ffile%) -replace %fold%, %fnew% | Out-File %ffile% -encoding utf8" 

Can also see the Replace and ReplaceFilter tools at https://zoomicon.github.io/tranXform/ (source included). The 2nd one is a filter.

The tool that replaces strings in files is in VBScript (needs Windows Script Host [WSH] to run in old Windows versions)

The filter is probably not working with Unicode unless you recompile with latest Delphi (or with FreePascal/Lazarus)

I have faced this problem several times while coding under Visual C++. If you have it, you can use Visual studio Find and Replace Utility. It allows you to select a folder and replace the contents of any file in that folder with any other text you want.

Under Visual Studio: Edit -> Find and Replace In the opened dialog, select your folder and fill in “Find What” and “Replace With” boxes. Hope this will be helpful.