Windowsコマンドライン環境を使用してバッチファイルスクリプトを作成していて、ファイル内のテキスト(例: "FOO")の出現ごとに別のテキスト(例: "BAR")を変更したい。それを行う最も簡単な方法は何ですか?組み込み関数はありますか?
echo(%text:%search%=%replace%%)
Windowsコマンドライン環境を使用してバッチファイルスクリプトを作成していて、ファイル内のテキスト(例: "FOO")の出現ごとに別のテキスト(例: "BAR")を変更したい。それを行う最も簡単な方法は何ですか?組み込み関数はありますか?
echo(%text:%search%=%replace%%)
回答:
ここでの回答の多くは私を正しい方向に導くのに役立ちましたが、どれも私に適したものではなかったので、私の解決策を投稿しています。
PowerShellが組み込まれたWindows 7を使用しています。これが、ファイル内のテキストのすべてのインスタンスを検索/置換するために使用したスクリプトです。
powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | Out-File -encoding ASCII myFile.txt"
それを説明するには:
powershell
Windows 7に含まれているpowershell.exeを起動します-Command "... "
実行するコマンドを含むpowershell.exeのコマンドライン引数です(gc myFile.txt)
内容が読み取らmyFile.txt
(gc
のために短いですGet-Content
コマンドの)-replace 'foo', 'bar'
単に置き換えるために置き換えるコマンドを実行しfoo
てbar
| Out-File myFile.txt
出力をファイルにパイプします myFile.txt
-encoding ASCII
コメントが指摘するように、出力ファイルをユニコードに転記しないようにしますPowershell.exeはすでにPATHステートメントの一部になっているはずですが、そうでない場合は追加できます。私のマシン上のその場所はC:\WINDOWS\system32\WindowsPowerShell\v1.0
-encoding ASCII
たりUTF8
、必要なものを追加したりできます。また、UTF8を対象とする場合、元のファイルにはなかったファイルの先頭にバイトオーダーマークが導入される可能性があることに注意してください。
-encoding ASCII
。将来それを必要とする人にとっては、それはOut-File -encoding ASCII myFile.txt
Set-Content
代わりに使用することだけでしたOut-File
。
.Net 2.0をサポートするWindowsバージョンを使用している場合は、シェルを置き換えます。 PowerShellは、コマンドラインから.Netのすべての機能を提供します。多くのコマンドレットも組み込まれています。以下の例はあなたの質問を解決します。私はコマンドの完全な名前を使用していますが、短いエイリアスがありますが、これによりGoogleに何かが与えられます。
(Get-Content test.txt) | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt
powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | sc myFile.txt"
使用したばかりのFART(「F ind A nd R eplace T ext」コマンドラインユーティリティ):
大きなファイルセット内のテキスト置換用の優れた小さなフリーウェア。
セットアップファイルはSourceForgeにあります。
使用例:
fart.exe -p -r -c -- C:\tools\perl-5.8.9\* @@APP_DIR@@ C:\tools
このPerlディストリビューションのファイルで再帰的に行う置換をプレビューします。
唯一の問題:FARTウェブサイトのアイコンは、正確に上品で洗練されているわけではありません;)
更新2017年(7年後)jagbポイントアウトのコメントで 2011年の記事に「-簡単な方法をおならテキストの検索と置換から」MikailTunç
/
と'
、このよう私たちのすべてのために働いていないことがいくつかで働いていた私にとって、例それはいくつかのファイルで作業しませんでしたと..私は他のテキストとテキストと置き換えるためにこれを使用する理由を私は知らない/
置換-文字列置換を使用して部分文字列を置換する説明:部分文字列を別の文字列で置換するには、文字列置換機能を使用します。ここに示す例では、文字列変数strで出現するすべての「teh」ミススペルを「the」に置き換えます。
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
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 "
RegExp
。これを使用して、正規表現を使用して置き換えることができますWith (New RegExp): strNewText = .Replace(strText, strOldText, strNewText): End With
。$1
、$2
... を使用して、最初の9つのキャプチャグループのテキストを取得できます$9
。
BatchSubstitute.bat
dostips.comは、純粋なバッチファイルを使用した検索と置換の例です。
これは、の組み合わせを使用しFOR
、FIND
かつCALL SET
。
間に文字を含む行"&<>]|^
は、正しく処理されない場合があります。
注 -REPL.BAT JREPL.BAT 7.0以降に代わる上位のJREPL.BATへのリンクについては、この回答の最後に必ず更新があることを確認してください。オプションによって、ユニコード(UTF-16LE)をネイティブでサポートしています。 ADOを介したUTF-8を含む他の文字セット!!!!
/UTF
REPL.BATと呼ばれる小さなハイブリッドJScript /バッチユーティリティを作成しましたコマンドラインまたはバッチファイルを介してASCII(または拡張ASCII)ファイルを変更するのに非常に便利なと作成しました。純粋にネイティブなスクリプトは、サードパーティの実行可能なファイルをインストールする必要がなく、XP以降のすべての最新のWindowsバージョンで動作します。また、特に純粋なバッチソリューションと比較すると、非常に高速です。
REPL.BATは単にstdinを読み取り、JScriptのregex検索と置換を実行し、結果をstdoutに書き込みます。
以下は、REPL.BATが現在のフォルダーにあるか、PATH内のどこかにあると仮定して、test.txtでfooをbarに置き換える方法の簡単な例です。
type test.txt|repl "foo" "bar" >test.txt.new
move /y test.txt.new test.txt
JScriptの正規表現機能は非常に強力です。特に、置換テキストが検索テキストからキャプチャされた部分文字列を参照する機能です。
このユーティリティには、非常に強力なオプションがいくつか含まれています。たとえばM
、X
オプションとを組み合わせると、バイナリファイルの変更が可能になります。M
マルチラインオプションは複数行に渡って検索することができます。X
拡張された置換パターンオプションは、置換テキスト内の任意のバイナリ値の包含を可能にエスケープシーケンスを提供します。
ユーティリティ全体を純粋なJScriptとして作成することもできますが、ハイブリッドバッチファイルを使用すると、ユーティリティを使用するたびにCSCRIPTを明示的に指定する必要がなくなります。
REPL.BATスクリプトは次のとおりです。完全なドキュメントはスクリプト内に埋め込まれています。
@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.BATに置き換えました。この新しいユーティリティは、REPL.BATと同じ機能に加えて、さらに多くの機能を備えています。
いつものように、完全なドキュメントはスクリプト内に埋め込まれています。
元の簡単な解決策はさらに簡単になりました。
jrepl "foo" "bar" /f test.txt /o -
JREPL.BATの現在のバージョンはDosTipsで入手できます。スレッドの後続の投稿をすべて読んで、使用例と開発の履歴を確認してください。
\q
を表すためにサポートするようにXオプションを"
拡張しました。LおよびXオプションを組み合わせたときに、検索リテラルがすべての拡張エスケープシーケンスをサポートするようになりました。
fnr
ユーティリティを使用します。それはいくつかの利点がありfart
ます:
ここからFNRをダウンロードします。 http //findandreplace.io/?z=codeplex
使用例:
fnr --cl --dir "<Directory Path>" --fileMask "hibernate.*" --useRegEx --find "find_str_expression" --replace "replace_string"
組み込みコマンドでそれを行う方法はないと思います。Gnuwin32やUnxUtilsなどをダウンロードして、sed
次のコマンドを使用することをお勧めします(またはダウンロードのみsed
)。
sed -c s/FOO/BAR/g filename
sed -i -b -e 's/FOO/BAR/g' `find . -name *.txt`
-i-ファイルをその場で編集します。-b-CR + LFを処理しません-このオプションがない場合、CR + LFはLFに変換されます
私はパーティーに遅れるのを知っています。
個人的に、私は次の解決策が好きです:-http : //www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace
また、Dedupe機能を幅広く使用して、SMTP経由で1日に約500通の電子メールを配信します。
これらはどちらもネイティブで機能し、追加のツールやユーティリティは必要ありません。
代替品:
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(ABA番号に-9を使用していることに注意してください):
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
ありがとう!
WindowsでGitgit-bash
を使用する場合は、起動して使用しますsed
。または、Windows 10を使用している場合は、「Linuxサブシステムから」「Windows上のUbuntuでBash」を起動して、sed
。
ストリームエディターですが、次のコマンドを使用してファイルを直接編集できます。
sed -i -e 's/foo/bar/g' filename
-i
オプションは、ファイル名を編集するために使用されます。-e
optionは、実行するコマンドを示します。
s
見つかった式「foo」を「bar」g
に置き換えるために使用され、見つかった一致を置き換えるために使用されます。ereOnによるメモ:
Gitリポジトリのバージョン管理されたファイルのみの文字列を置き換える場合は、次のように使用できます。
git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'
これは不思議に機能します。
git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'
。
ここで既存の回答のいくつかをいじって、改善されたソリューションを好みます...
type test.txt | powershell -Command "$input | ForEach-Object { $_ -replace \"foo\", \"bar\" }"
または、出力をファイルに再度保存する場合...
type test.txt | powershell -Command "$input | ForEach-Object { $_ -replace \"foo\", \"bar\" }" > outputFile.txt
これの利点は、任意のプログラムからの出力をパイプ処理できることです。これで正規表現の使用についても調べます。簡単に使用できるようにBATファイルにする方法を考え出せませんでした... :-(
type
すると、80文字を超えるすべての行が折り返されます。なんて痛い。
私はperlを使用しましたが、それは驚くほどうまくいきます。
perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" <fileName>
.origは、元のファイルに追加する拡張子です
* .htmlなどの多数のファイルが一致する場合
for %x in (<filePattern>) do perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" %x
sed
てperl -pi.backup -e
評価してください:)
1)およびunicodeシーケンスのe?
ような特殊文字シーケンスを評価するオプション付き\n\r
。この場合、引用符で囲まれた"Foo"
と置き換え"Bar"
ます:
call replacer.bat "e?C:\content.txt" "\u0022Foo\u0022" "\u0022Bar\u0022"
2)Foo
およびBar
が引用されていない箇所を簡単に置き換える。
call replacer.bat "C:\content.txt" "Foo" "Bar"
Win XPで動作することがわかった解決策は次のとおりです。実行中のバッチファイルには、以下を含めました。
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
replace.bat
ファイルは以下の通りです。%%a
変数は常にforループの最後の値を与えるように見えるため、同じバッチファイル内にその関数を含める方法は見つかりませんでした。
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
見てみましょう任意のcmd.exeのためのユーティリティのようにsedのですが、Windowsでsedの同等を求めたとしても、この質問に適用する必要があります。エグゼクティブサマリー:
少し遅れるかもしれませんが、ソフトウェアの承認を得る苦労を避けたいので、よく似たものを探しています。
ただし、通常はFORステートメントをさまざまな形式で使用します。誰かが検索と置換を行う便利なバッチファイルを作成しました。見ていこちらを。提供されるバッチファイルの制限を理解することが重要です。このため、この回答ではソースコードをコピーしません。
search and replace
関数を提供する2つのバッチファイルは、スタックオーバーフローメンバーによって書き込まれ、Windows dbenham
でaacini
使用さnative built-in jscript
れています。
これらは両方ともrobust
、very swift with large files
プレーンバッチスクリプトと比較されsimpler
、テキストの基本的な置換にも使用されます。どちらにもWindows regular expression
パターンマッチングがあります。
このsed-like
ヘルパーバッチファイルはrepl.bat
(dbenhamによって)呼び出されます。
L
リテラルスイッチの使用例:
echo This is FOO here|repl "FOO" "BAR" L
echo and with a file:
type "file.txt" |repl "FOO" "BAR" L >"newfile.txt"
このgrep-like
ヘルパーバッチファイルはfindrepl.bat
(aaciniによって)呼び出されます。
正規表現がアクティブな例:
echo This is FOO here|findrepl "FOO" "BAR"
echo and with a file:
type "file.txt" |findrepl "FOO" "BAR" >"newfile.txt"
どちらもシステム全体の強力なユーティリティwhen placed in a folder that is on the path
になるか、バッチファイルと同じフォルダで、またはcmdプロンプトから使用できます。
どちらにもcase-insensitive
スイッチと他の多くの機能があります。
Power Shellコマンドは魅力のように機能します
(
test.txt | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt
)
「ファイル内のテキストを検索して置換する」という同様の問題に直面しましたが、ファイル名と検索/置換の両方で、正規表現を使用する必要があるという例外があります。私はPowershellに慣れておらず、後で使用するために検索結果を保存したいので、もっと「ユーザーフレンドリー」なものが必要です(GUIがある場合は望ましい)。
だから、グーグルしながら:)私は素晴らしいツールを見つけました-FAR (検索と置換)(FARTではありません)。
その小さなプログラムは素晴らしいGUIを持ち、ファイル名やファイル内を検索するための正規表現をサポートしています。唯一の欠点は、設定を保存する場合は、プログラムを管理者として実行する必要があることです(少なくともWin7では)。
Win32のGNUユーティリティを使用sed
したいのですが、次の点に注意する必要があります。
- 一重引用符
''
はWindowsでは機能しません。""
代わりに使用してくださいsed -i
Windowsでは機能しません。ファイルの交換が必要です。
したがって、sed
Windowsでファイル内のテキストを検索して置換するための作業コードは次のとおりです
sed -e "s/foo/bar/g" test.txt > tmp.txt && mv tmp.txt test.txt
-i
!によるインプレース編集をサポートしています。あなたのsedバージョンがそうなら、この回答からのコマンドを確認してください:stackoverflow.com/a/33762001/2492801。
これは、バッチスクリプトがうまく機能しないことの1つです。
morechilliにリンクされたスクリプトは一部のファイルで機能しますが、残念ながら、パイプやアンパサンドなどの文字を含むファイルでは動作しなくなります。
VBScriptは、このタスクに適した組み込みツールです。例については、この記事を参照してください:http : //www.microsoft.com/technet/scriptcenter/resources/qanda/feb05/hey0208.mspx
@Rachelは素晴らしい答えを出しましたが、Powershell $data
変数にコンテンツを読み取るためのバリエーションがあります。その後、出力ファイルに書き込む前に、コンテンツを複数回簡単に操作できます。また、複数行の値が.batバッチファイルでどのように指定されるかを確認してください。
@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%"
Visual C ++でコーディングしているときに、この問題に何度か直面しました。お持ちの場合は、Visual Studioの検索と置換ユーティリティを使用できます。フォルダーを選択して、そのフォルダー内のファイルの内容を他のテキストに置き換えることができます。
Visual Studio:Edit-> Find and Replaceで、開いたダイアログでフォルダーを選択し、「Find What」と「Replace With」ボックスに入力します。これがお役に立てば幸いです。