如何使用Windows命令行环境查找和replace文件中的文本?

我正在使用Windows命令行环境编写一个batch file脚本,并且希望将另一个文件(例如“BAR”)中的某些文本(例如“FOO”)的每次出现都更改。 什么是最简单的方法来做到这一点? 任何内置函数?

如果你在支持.Net 2.0的Windows版本上,我会replace你的shell。 PowerShell从命令行为您提供.Net的全部function。 还有许多内置的命令行。 下面的例子将解决你的问题。 我使用的命令的全名,有更短的别名,但这给了你一些谷歌。

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

这里的很多答案帮助我指出了正确的方向,但是没有一个适合我,所以我张贴我的解决scheme。

我有Windows 7,内置了PowerShell。 以下是我用来查找/replace文件中所有文本实例的脚本:

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

解释一下:

  • powershell启动powershell.exe,它包含在Windows 7中
  • -Command "... "是包含要运行的命令的powershell.exe的命令行arg
  • (gc myFile.txt)读取(gc myFile.txt)的内容( gcGet-Content命令的缩写)
  • replace-replace 'foo', 'bar'只是运行replace命令来replacefoo
  • | Out-File myFile.txt | Out-File myFile.txt将输出输出到文件myFile.txt

Powershell.exe应该已经成为您的PATH语句的一部分,但是如果没有,您可以添加它。 它在我的机器上的位置是C:\WINDOWS\system32\WindowsPowerShell\v1.0

刚刚使用了FART (“ F ind AR eplace T ext”命令行工具):
优秀的免费软件,用于在一大组文件中进行文本replace。

安装文件在SourceForge上 。

用法示例:

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

将预览这个替代品在Perl发行版的文件中recursion地执行。

唯一的问题:FART网站的图标不够高雅,精致或优雅;)


更新2017年(7年后) jagb 在评论中指出了MikailTunçy2011年发表的文章 “ 快速find并replace文本 ”

replace – 使用stringreplacereplace子string描述:要用另一个stringreplace子string,请使用stringreplacefunction。 这里显示的例子用stringvariablesstr中的“the”replace所有出现的“teh”拼写错误。

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

脚本输出:

 teh cat in teh hat the cat in the hat 

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

创build文件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 

要使用这个修改过的脚本(我们将其称为replace.vbs),只需在命令提示符下键入一个与此类似的命令即可:

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

BatchSubstitute.bat上的BatchSubstitute.bat是使用纯batch file进行search和replace的示例。

它使用FORFINDCALL SET的组合。

包含"&<>]|^中的字符的行可能会被错误地处理。


注意 – 请确保在本答复末尾看到更新,以获取替代REPL.BAT的高级JREPL.BAT的链接
JREPL.BAT 7.0及以上版本通过/UTF选项本地支持unicode(UTF-16LE),以及任何其他字符集,包括UTF-8,通过ADO!


我写了一个名为REPL.BAT的小型混合JScript /批处理实用程序 ,通过命令行或batch file修改ASCII(或扩展ASCII)文件非常方便。 纯粹的本地脚本不需要任何第三方可执行的安装,它可以在XP以上的任何现代Windows版本上运行。 它也非常快,特别是与纯批量解决scheme相比。

REPL.BAT只是读取标准input,执行JScr​​ipt正则expression式search并replace,并将结果写入标准输出。

这里是一个简单的例子,如何用test.txt中的bar代替foo,假设REPL.BAT位于当前文件夹中,或者更好,在PATH中的某处:

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

JScript的正则expression式function使其非常强大,尤其是replace文本从search文本引用捕获的子string的能力。

我在实用程序中包含了很多选项,使它非常强大。 例如,结合MX选项可以修改二进制文件! M多行选项允许跨多行search。 X扩展replace模式选项提供转义序列,使replace文本中包含任何二进制值。

整个实用程序可以被写成纯JScript,但是混合batch file不需要每次使用该实用程序都明确指定CSCRIPT。

这是REPL.BAT脚本。 完整的文档embedded在脚本中。

 @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)); } 

重要更新

我停止了REPL.BAT的开发,并用JREPL.BATreplace了它。 这个新的实用程序具有REPL.BAT的所有function,以及更多:

  • Unicode UTF-16LE支持通过本地CSCRIPT unicodefunction,以及任何其他字符集(包括UTF-8)通过ADO。
  • 直接从/直接写入文件:不需要pipe道,redirect或移动命令。
  • 整合用户提供的JScript
  • 翻译工具类似于unix tr,只支持正则expression式search和JScriptreplace
  • 丢弃不匹配的文本
  • 用行号前缀输出行
  • 和更多…

一如既往,完整的文档被embedded到脚本中。

原来简单的解决scheme现在更简单了:

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

目前版本的JREPL.BAT可在DosTips上find 。 阅读线程中的所有后续文章,查看使用情况和开发历史的示例。

使用FNR

使用fnr工具。 与fart相比,它有一些优势:

  • 正则expression式
  • 可选的GUI。 有一个“生成命令行button”来创build命令行文本放入batch file。
  • 多线模式:使用GUI可以轻松处理多线模式。 在FART中,您将不得不手动换行换行符。
  • 允许您select文本文件编码。 还有一个自动检测选项。

在这里下载FNR: http : //findandreplace.codeplex.com/

用法示例: fnr --cl --dir "<Directory Path>" --fileMask "hibernate.*" --useRegEx --find "find_str_expression" --replace "replace_string"

我不认为有任何内置的命令可以做到这一点。 我build议你下载像Gnuwin32或UnxUtils的东西,并使用sed命令(或只下载sed ):

 sed -cs/FOO/BAR/g filename 

我知道我晚了

就我个人而言,我喜欢这个解决scheme: – http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace

我们还广泛使用重复数据删除function,帮助我们每天通过SMTP发送大约500封电子邮件: https ://groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o

而且这两者都可以在本地工作,不需要额外的工具或实用程序。

替代品:

 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(请注意使用-9作为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 

谢谢!

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 

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… 🙁

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 <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'

which works wonders.

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 

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" 

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:

  • 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. 看看这里 。 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

For simple string replaces in files I use since years free Xchang32.exe from Clay's Utilities for Win32 collection.

It has several options for fast replacing strings in text files as well as bytes in binary files. It supports also wildcards in file name string and can be executed for that reason also on all files in a directory matching the wildcard pattern.

And nothing else is needed for this little 32-bit console application than the file Xchang32.exe extracted from ZIP file into any directory like the directory of the batch file calling it for the replace(s).

例:

 Xchang32.exe MyBinaryFile.bin "^x03" "^x02^x05" 

This command line replaces in file MyBinaryFile.bin each byte with value 3 by two bytes with the values 2 and 5.

A common issue with usage of wmic is that the output is a Unicode file although all characters are definitely in ASCII character range, ie have a code point value lower than decimal 128.

This small batch code using Xchang32 converts the wmic Unicode output file containing only ASCII characters to an ASCII text file.

 @echo off rem Remove UTF-16 little endian byte order mark. Xchang32.exe WmicOutput.txt "^xFF^xFE" "" >nul rem Was UTF-16 LE BOM really present in file, remove all null bytes. if not errorlevel 1 Xchang32.exe WmicOutput.txt "^x00" "" >nul 

But sometimes the output of wmic is redirected directly into an ASCII text file resulting in CR CR LF (0D 0D 0A) in the ASCII text file instead of just 0D 0A (carriage return + line-feed). Those wrong line terminations can be also easily corrected using Xchang32 :

 Xchang32.exe WmicOutput.txt "^x0D^x0D" "^x0D" 

Or all *.csv files in a directory use a horizontal tab character as separator and all those tabs in the CSV files should be replaced by a comma.

 Xchang32.exe *.csv "^x09" ",," 

Note: ^ and , have a special meaning in Xchang32 syntax and therefore must be escaped with another ^ or , as done in the command line above, or switch /s is used for simple strings. This is documented in file ReadMe32.txt as well as in help output on running Xchang32.exe /? in a command prompt window.

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

Your best bet: sed

@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%" 

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.