Windowsコマンドライン環境を使用して、ファイル内のテキストをどのように見つけて置換できますか?


492

Windowsコマンドライン環境を使用してバッチファイルスクリプトを作成していて、ファイル内のテキスト(例: "FOO")の出現ごとに別のテキスト(例: "BAR")を変更したい。それを行う最も簡単な方法は何ですか?組み込み関数はありますか?



:この使用echo(%text:%search%=%replace%%)
scientist_7

回答:


308

ここでの回答の多くは私を正しい方向に導くのに役立ちましたが、どれも私に適したものではなかったので、私の解決策を投稿しています。

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.txtgcのために短いですGet-Contentコマンドの)
  • -replace 'foo', 'bar'単に置き換えるために置き換えるコマンドを実行しfoobar
  • | Out-File myFile.txt 出力をファイルにパイプします myFile.txt
  • -encoding ASCII コメントが指摘するように、出力ファイルをユニコードに転記しないようにします

Powershell.exeはすでにPATHステートメントの一部になっているはずですが、そうでない場合は追加できます。私のマシン上のその場所はC:\WINDOWS\system32\WindowsPowerShell\v1.0


71
このコマンドは、ファイルをUnicodeエンコーディングにトランスコードする場合もあります。エンコーディングを手動で指定し-encoding ASCIIたりUTF8、必要なものを追加したりできます。また、UTF8を対象とする場合、元のファイルにはなかったファイルの先頭にバイトオーダーマークが導入される可能性があることに注意してください。
Wyck、2014年

78
@Wyckどこに置くべきかを理解するのにしばらく時間がかかりました-encoding ASCII。将来それを必要とする人にとっては、それはOut-File -encoding ASCII myFile.txt
rwilson04 '

15
変更しなければならなかったことは、のSet-Content代わりに使用することだけでしたOut-File
kurtzmarc 14

6
これは機能しますが、短いファイルリストでもパフォーマンスはひどいものです。
jsuddsjr

23
replaceトークン(この場合は「foo」)は正規表現として扱われることに注意してください。そこに特殊文字がある場合(私は[]がありました)、\(バックスラッシュ)を前に付ける必要があります。
JW

183

.Net 2.0をサポートするWindowsバージョンを使用している場合は、シェルを置き換えます。 PowerShellは、コマンドラインから.Netのすべての機能を提供します。多くのコマンドレットも組み込まれています。以下の例はあなたの質問を解決します。私はコマンドの完全な名前を使用していますが、短いエイリアスがありますが、これによりGoogleに何かが与えられます。

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

10
PowerShellはこれをアーカイブできることがわかります。しかし、これをバッチファイル(例:myProc.bat)から実行するにはどうすればよいですか?
Pablo Venturino 2010

3
@ Pablo、powershell.exeを使用し、psコマンドを単一のパラメーターにラップする
lubos hasko

56
-1 ..確かに回答は受け入れられましたが、指定された質問に対する回答ではありません。
baash05

28
同じファイルに保存すると、使用中のファイルのエラーで失敗します。powershellコマンドを次のように変更する必要があります:(Get-Content test.txt)| ForEach-Object {$ _ -replace "foo"、 "bar"} | Set-Content test.txt
BigMomma 2012

6
@Rachelからの回答を参照してください。– powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | sc myFile.txt"
Nigel Touch

161

使用したばかりの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ç


19
クールなのは、それが1つのexeであることです。依存関係はありません。小さなプリントはありません。導入が非常に簡単。
Serge Wautier、2011年

2
非常に軽量で使いやすいですが、交換が行われた正確な場所が出力されることを期待していました。それが見えないので不安になりました。
William Niu

4
おかげで、それは完璧です。標準のDOSツールの一部であり、魅力的に機能するはずです。ただし、-pオプションは、「変更」が行われる変更の数を表示せず、常に0を報告するため、数
分の間

3
これは非常に古い質問であることを理解していますが、さらに情報が見つかり、Stack Overflowユーザーに役立つことを願っています。製品が十分に説明されてFARTのためのちょうど別のリンク:FART explaned @ emtunc.orgと別のページには、ここで見つけることができます:おなら の交換に注意してください/'、このよう私たちのすべてのために働いていないことがいくつかで働いていた私にとって、例それはいくつかのファイルで作業しませんでしたと..私は他のテキストとテキストと置き換えるためにこれを使用する理由を私は知らない/
jagb

4
@jagbありがとうございます。より見やすくするために、回答にあなたのリンクを含めました。
VonC 2017年

128

置換-文字列置換を使用して部分文字列を置換する説明:部分文字列を別の文字列で置換するには、文字列置換機能を使用します。ここに示す例では、文字列変数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


30
sedの提案はどのように優れていますか?これはそれらすべての中で最も単純な答えのようであり、何もインストールする必要はありません。
DonBecker 2012年

5
ここで何らかのパターンマッチングを実行できますか?ワイルドカード、正規表現など?
Keyo 2012

27
「sedの提案はどのように優れていますか?」-sedおよび同様のユーティリティがファイルを操作します。このスニペットでは、入力ファイルから行を読み取り、出力ファイルに書き込むという重要なステップを省略し、ファイル内の特殊文字が正しく処理されるようにします。
Joe

7
@アサド、そうです、そうです、OPはファイルについて尋ねていましたが、実際には、ファイルである必要のないストリームで動作します。しかし、ここでの私のポイントは、ストリームからの読み取りと書き込み、および特殊文字の処理が省略されているため、この回答には欠陥があるということです。
ジョー

4
@Bill変数を置換テキストとして使用する方法は?すなわち。変数に値があり、文字列が少し限定されています。set str =%str: "##" =%varValue %%は機能しません。回避策はありますか?
MalTec 2014

55

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 "


これは素晴らしいですが、RegExを使用できますか?
user280109 14年

3
@ user280109はい、VBScriptはをサポートしていますRegExp。これを使用して、正規表現を使用して置き換えることができますWith (New RegExp): strNewText = .Replace(strText, strOldText, strNewText): End With$1$2... を使用して、最初の9つのキャプチャグループのテキストを取得できます$9
歯ブラシ2014年

2
VBScriptは見過ごされがちですが(そして嫌われています)、すべてのWindowsプラットフォームで使用でき、非常に読みやすく、非常に強力な機能を備えています+1
zelanix

1
@ user280109あなたはちょうど私が必要とするコマンドを与えました。しかし、私は置き換えたいです(大文字と小文字を区別しません)そのためのコマンドを提供できますか?
Ajmal Praveen 2017

49

BatchSubstitute.bat dostips.comは、純粋なバッチファイルを使用した検索と置換の例です。

これは、の組み合わせを使用しFORFINDかつCALL SET

間に文字を含む行"&<>]|^は、正しく処理されない場合があります。



8
利用規約でコードのコピーを禁止しているコードスニペットサイトの有用性について質問する必要があります(「ドメイン所有者の書面による明示的な許可なしに、ドメインdostips.comで提供される情報をいかなる形式でも配布することはできません。」) 。
Gilles「SO-悪をやめなさい」

1
条件がわかりにくいことに同意し、「ドメインdostips.comで提供された情報が役に立つと期待しています」とも書かれているので、問題を解決するためにコードをコピーしてもらえれば幸いです。利用規約を読んで満足していることが
よくわかりませ

5
これは素晴らしい。私はそれを行うために何か他のものをダウンロードすることを含まない答えが大好きです。
Ruairi O'Brien

外部ユーティリティを使用しないソリューションも好きですが、残念ながら、このバッチを実行しようとすると、「find:invalid predicate `'」が表示され続けます。今すぐデバッグする時間はありません。
Jahmic 2013

2
「find:invalid predicate `'」エラーは、システムの外部「find」ユーティリティが原因でした。削除すると、これは正常に機能しました。
Jahmic 2013

47

-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の正規表現機能は非常に強力です。特に、置換テキストが検索テキストからキャプチャされた部分文字列を参照する機能です。

このユーティリティには、非常に強力なオプションがいくつか含まれています。たとえばMXオプションとを組み合わせると、バイナリファイルの変更が可能になります。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と同じ機能に加えて、さらに多くの機能を備えています。

  • ネイティブCSCRIPTユニコード機能によるUnicode UTF-16LEサポート、およびADOによるその他の文字セット(UTF-8を含む)。
  • ファイルから直接読み取る/ファイルに直接書き込む:パイプ、リダイレクト、移動コマンドは不要です。
  • ユーザー提供のJScriptを組み込む
  • unix trに似た翻訳機能ですが、正規表現検索とJScript置換もサポートしています。
  • 一致しないテキストを破棄する
  • 出力行の先頭に行番号を付ける
  • もっと...

いつものように、完全なドキュメントはスクリプト内に埋め込まれています。

元の簡単な解決策はさらに簡単になりました。

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

JREPL.BATの現在のバージョンはDosTipsで入手できます。スレッドの後続の投稿をすべて読んで、使用例と開発の履歴を確認してください。


素晴らしいもの!私はこのb / cのシンプルさと、どのようなスクリプトにも適用できる方法が好きなので、くだらないバッチよりもJSコードを作成します。
Adaptabi 2013年

編集-変更された行のみを印刷するAオプションが追加されました。また、\qを表すためにサポートするようにXオプションを"拡張しました。LおよびXオプションを組み合わせたときに、検索リテラルがすべての拡張エスケープシーケンスをサポートするようになりました。
dbenham 2013年

@dbenham-+1。これは洗練されたアプローチであり、他のいくつかのタスクにも役立ちます。投稿いただきありがとうございます。
bw

編集-コードが拡張ASCIIバイトコードを表すように、Xオプションを使用したときの\ xnnの動作を変更しました。/ Vバージョンオプションも追加されました。
dbenham 2013年

9
@dbenhamこれは宝石です。GitHubやGistHubに載せてみませんか?バージョン管理、フォローアップ、リリース/配布、修正などをより簡単にします。サポートが必要な場合はお知らせください。
Atif Aziz 2015

36

FNRを使用

fnrユーティリティを使用します。それはいくつかの利点がありfartます:

  • 正規表現
  • オプションのGUI。バッチファイルに配置するコマンドラインテキストを作成するための「コマンドラインの生成ボタン」があります。
  • 複数行パターン:GUIを使用すると、複数行パターンを簡単に操作できます。FARTでは、手動で改行をエスケープする必要があります。
  • テキストファイルのエンコーディングを選択できます。自動検出オプションもあります。

ここからFNRをダウンロードします。 http //findandreplace.io/?z=codeplex

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


1
これはいいね。GUIからコマンドラインを生成できることは、素早いシンプルな機能であり、すぐに取り掛かることができました。
David Hammond

とても便利なツールです。以前にFARTを試しましたが、ドキュメントが古くなっています。
ArturKędzior2014

クールなツールで、正規表現もサポートしています。これはFARTにはないものです。
Dio Phung、2014年

1
このツールをご提示いただきありがとうございます。単一のexe、FARTの優れた代替品であり、もはや開発されていません(正規表現がありません)。そして、PowerShellの構文は非常に耐え難いです。
Gras Double

これは最も便利です。Windowsでgrep + sedの代替を探していましたが、これはうまくいきました!
セルバンタナサ2015

25

組み込みコマンドでそれを行う方法はないと思います。Gnuwin32UnxUtilsなどをダウンロードして、sed次のコマンドを使用することをお勧めします(またはダウンロードのみsed)。

sed -c s/FOO/BAR/g filename

2
cygwin(cygwin.com)を使用します。これは、実際にLinuxをインストールする次善の策です。
アンドリュージョンソン

cygwinのインストールに依存しないソリューションを提供できれば、さらに良いでしょう。POSIXの文字列操作は非常に簡単です。Windowsでこれを行うのは少しあいまいです。
レックス

4
Gnuwin32とUnxUtilsは、Windows用に構築されたスタンドアロンのバイナリです。それらはcygwinに依存していません。
Ferruccio

1
cygwin:sed -i -b -e 's/FOO/BAR/g' `find . -name *.txt`-i-ファイルをその場で編集します。-b-CR + LFを処理しません-このオプションがない場合、CR + LFはLFに変換されます
Alexey Vishentsev 2013

@AndrewJohnson意見と情報は2つの異なるものです。
Preza8

21

私はパーティーに遅れるのを知っています。

個人的に、私は次の解決策が好きです:-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

ありがとう!


バッチスクリプトは単なるファイルコピー以外には何も行いません。また、なぜ感謝しているのですか。
specializ

元の要求は、バッチスクリプトを使用して、できれば組み込み関数を使用して、テキストファイルの「FOO」を「BAR」に置き換えることでした。私がGoogleグループの投稿に感謝しているとしたら、それは素晴らしい動作であり、私たちは今日でもそれを使用しています。また、これらのような投稿や応答は、将来のユーザーにも役立つものとして参照してください。ファイルコピーについてのコメントを確認できませんでした。確かに、1つのファイルのコンテンツを取得し、その結果を別のファイルにエコーしますが、データに基づいて、必要な情報をトリミングして解析します。最初に試してみることをお勧めします。;)
レプトネーター2016

2静的な文字列を置換し、その基本的にファイルコピーツール-人々ので、あなたは、少なくともそこに2つの変数を配置した可能性がしたいことをしようとするが、実際にそれを使用できるようにするために、構文を理解する必要が文句を言わない-にも:インターネット上での仮定はほとんど常に完全に間違っています。覚えておいてください。
specializ

4
@specializt-お願い...セマンティクスについて議論するために私はここにいません。よろしければ、これをオフラインでチャットルームに移動できますか?
レプトネーター2016

2
私の意見では、これは元の質問に対する答えです。このヒントを使用して、セットアップ中にサービスの初期化ファイルを構成します。PowerShellを有効にしたり、サーバーでスクリプトエンジンを実行したりしたくありません。Windowsに関連する質問への回答が多いので、「このギズモをそこからインストールする」から始めてください。
mico

15

WindowsGitgit-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'

これは不思議に機能します。


1
実際にgitリポジトリでその名前変更を行っていて、バージョン管理されたファイルのみを置き換えたい場合は、次のようにすることをお勧めしますgit ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'
ereOn 2016年

13

ここで既存の回答のいくつかをいじって、改善されたソリューションを好みます...

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ファイルにする方法を考え出せませんでした... :-(


3
これは良い解決策です。残念ながら、使用typeすると、80文字を超えるすべての行が折り返されます。なんて痛い。
sirdank 2015

12

私は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

これは、shからbatに変換するときに最も簡単なソリューション+1です。置き換えsedperl -pi.backup -e評価してください:)
Yann39

11

replacer.bat

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"

うまくいきません。これをどのように実行しますか?「replace_in_config.bat」が内部または外部のコマンド、操作可能なプログラム、またはバッチファイルとして認識されないというエラーが表示されます。
FrenkyB

@FrenkyB-呼び出し元と同じディレクトリまたはパスにある必要があります-ss64.com/nt/path.html
npocmaka

3つのファイルすべてを同じディレクトリに入れました。
FrenkyB

9

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

1
残念ながら、これも空白行をスキップします。機能 {{}}のためのコマンド。
John Rocha

7

見てみましょう任意のcmd.exeのためのユーティリティのようにsedのですが、Windowsでsedの同等を求めたとしても、この質問に適用する必要があります。エグゼクティブサマリー:

  • それはバッチファイルで行うことができますが、それはかなりではありません
  • exeをインストールまたは単にコピーするだけの贅沢がある場合は、それを実行する多くの利用可能なサードパーティの実行可能ファイル
  • 変更せずにWindowsボックスで実行できるものが必要な場合は、VBScriptなどで実行できます。

4

少し遅れるかもしれませんが、ソフトウェアの承認を得る苦労を避けたいので、よく似たものを探しています。

ただし、通常はFORステートメントをさまざまな形式で使用します。誰かが検索と置換を行う便利なバッチファイルを作成しました。見ていこちらを。提供されるバッチファイルの制限を理解することが重要です。このため、この回答ではソースコードをコピーしません。


4

search and replace関数を提供する2つのバッチファイルは、スタックオーバーフローメンバーによって書き込まれ、Windows dbenhamaacini使用さnative built-in jscriptれています。

これらは両方ともrobustvery swift with large filesプレーンバッチスクリプトと比較されsimpler、テキストの基本的な置換にも使用されます。どちらにもWindows regular expressionパターンマッチングがあります。

  1. この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"
    
  2. この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スイッチと他の多くの機能があります。


3

Power Shellコマンドは魅力のように機能します

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

3

「ファイル内のテキストを検索して置換する」という同様の問題に直面しましたが、ファイル名と検索/置換の両方で、正規表現を使用する必要があるという例外があります。私はPowershellに慣れておらず、後で使用するために検索結果を保存したいので、もっと「ユーザーフレンドリー」なものが必要です(GUIがある場合は望ましい)。

だから、グーグルしながら:)私は素晴らしいツールを見つけました-FAR (検索と置換)(FARTではありません)。

その小さなプログラムは素晴らしいGUIを持ち、ファイル名やファイル内を検索するための正規表現をサポートしています。唯一の欠点は、設定を保存する場合は、プログラムを管理者として実行する必要があることです(少なくともWin7では)。


これは、2010 @VonCからの回答と同じ答えです。このスレッドで
ジェブ

@jeb私はFARFARTではないことを指摘しました -ほとんど同じ名前の2つの異なるプログラム。FARにはGUIがあり、正規表現を使用できますが、以下のコメントでは、FARTは正規表現をサポートしていないことをスレッドの人々は述べています。
madcorp 2015

3

Win32のGNUユーティリティを使用sedしたいのですが、次の点に注意する必要があります。

  • 一重引用符''はWindowsでは機能しません。""代わりに使用してください
  • sed -iWindowsでは機能しません。ファイルの交換が必要です。

したがって、sedWindowsでファイル内のテキストを検索して置換するための作業コードは次のとおりです

sed -e "s/foo/bar/g" test.txt > tmp.txt && mv tmp.txt test.txt

2
Windowsユーザーがすぐにファイルスワッピングを行う前:新しいバージョンのsedは、-i!によるインプレース編集をサポートしています。あなたのsedバージョンがそうなら、この回答からのコマンドを確認してください:stackoverflow.com/a/33762001/2492801
ベンジャミンビーラー

2

これは、バッチスクリプトがうまく機能しないことの1つです。

morechilliにリンクされたスクリプトは一部のファイルで機能しますが、残念ながら、パイプやアンパサンドなどの文字を含むファイルでは動作しなくなります。

VBScriptは、このタスクに適した組み込みツールです。例については、この記事を参照してください:http : //www.microsoft.com/technet/scriptcenter/resources/qanda/feb05/hey0208.mspx


2

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

2

.batでpowershellを使用する-Windows 7以降の場合

utf8のエンコードはオプションで、Webサイトに適しています

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

1

Cygwin(無料)をダウンロードし、Windowsコマンドラインでunixのようなコマンドを使用します。

あなたの最善の策:sed


10
Cygwinは悪です。インストールしないでください。下記のUnixUtilsを使用することをお勧めします。
zedoo 2010

24
何がそんなに悪いの?
jm。

@jmいつでも単一の実行可能ファイルを使用するのではなく、全部を一緒にインストールする必要があるためです。
アンドリー

powershellを使用するほうがいいです。実際にはWindowsに組み込まれています。
Preza8

0

また、https: //zoomicon.github.io/tranXform/でReplaceおよびReplaceFilterツールを確認できます。(ソースが含まれています)。2つ目はフィルターです。

ファイル内の文字列を置き換えるツールはVBScriptにあります(古いバージョンのWindowsで実行するにはWindows Script Host [WSH]が必要です)

最新のDelphi(またはFreePascal / Lazarus)で再コンパイルしない限り、フィルターはおそらくUnicodeで動作しません。


-5

Visual C ++でコーディングしているときに、この問題に何度か直面しました。お持ちの場合は、Visual Studioの検索と置換ユーティリティを使用できます。フォルダーを選択して、そのフォルダー内のファイルの内容を他のテキストに置き換えることができます。

Visual Studio:Edit-> Find and Replaceで、開いたダイアログでフォルダーを選択し、「Find What」と「Replace With」ボックスに入力します。これがお役に立てば幸いです。


2
ナジブ、あなたの答えはユーザーを助けません。なぜなら、彼らは彼らが言及していないソフトウェアを使用していると想定しているからです。ソフトウェアを必要としないオプションを提案してください。
Aibrean 2015年

@Aibrean答えは無駄ですが、その理由ではありません。間違っているのはエントリポイントです。
ポール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.