557

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

4

30 に答える 30

391

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

PowerShell が組み込まれた Windows 7 を使用しています。ファイル内のテキストのすべてのインスタンスを検索/置換するために使用したスクリプトは次のとおりです。

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

それを説明するには:

  • powershellWindows 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

更新
どうやら最新のWindowsシステムにはPowerShellが組み込まれており、これを使用して直接アクセスできます

(Get-Content myFile.txt) -replace 'foo', 'bar' | Out-File -encoding ASCII myFile.txt
于 2014-01-08T15:01:35.567 に答える
187

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

(Get-Content test.txt) | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt
于 2008-09-12T22:01:49.893 に答える
175

FART (" F ind A nd Replace Text "コマンドライン ユーティリティ) を使用しました。大量のファイル セット内のテキストを置換するための優れた小さなフリーウェアです。

セットアップ ファイルは SourceForge にあります

使用例:

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

この Perl ディストリビューションのファイルで再帰的に行う置換をプレビューします。

唯一の問題: FART Web サイトのアイコンは、洗練されていたりエレガントであったりするわけではありません ;)


2017 年の更新 (7 年後) jagbは、2011 年の記事 " FARTing the Easy Way – Find And Replace Text " のMikail Tunçのコメントで指摘しています。


コメントでJoe Jobsが指摘したように(2020 年 12 月)、たとえば置き換えたい場合は、シェルによって解釈されないようにするために引用符を使用する必要があります。&A&

fart in.txt "&A" "B" 
于 2010-03-02T12:34:36.493 に答える
138

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

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

于 2011-05-28T01:25:35.673 に答える
60

ファイル 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 "

于 2010-09-27T04:22:47.917 に答える
51

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

FOR、、 の組み合わせを使用しFINDますCALL SET

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


于 2008-09-15T17:14:09.530 に答える
51

注- REPL.BATに取って代わる優れたJREPL.BATのリンクについては、この回答の最後にある更新を必ず確認してください。ADO 経由の UTF-8 を含むその他の文字セット!!!!
/UTF


コマンド ラインまたはバッチ ファイルを介して ASCII (または拡張 ASCII) ファイルを変更するのに非常に便利な、 REPL.BAT と呼ばれる小さなハイブリッド JScript/バッチ ユーティリティを作成しました。純粋なネイティブ スクリプトは、サード パーティの実行可能ファイルのインストールを必要とせず、XP 以降の最新の Windows バージョンで動作します。また、特に純粋なバッチ ソリューションと比較すると、非常に高速です。

REPL.BAT は、単に stdin を読み取り、JScript 正規表現の検索と置換を実行して、結果を 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複数行にわたる検索が可能になります。eXtended 置換パターン オプションは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 機能による Unicode UTF-16LE サポート、および ADO によるその他の文字セット (UTF-8 を含む)。
  • ファイルから直接読み取り/ファイルに直接書き込み: パイプ、リダイレクト、または移動コマンドは必要ありません。
  • ユーザー提供の JScript を組み込む
  • unix tr に似た翻訳機能ですが、正規表現検索と JScript 置換もサポートしています。
  • 一致しないテキストを破棄
  • 出力行の先頭に行番号を付ける
  • もっと...

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

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

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

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

于 2013-05-24T12:32:29.357 に答える
41

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"

于 2013-01-18T09:45:46.343 に答える
28

私はパーティーに遅れていることを知っています..

個人的には、次のソリューションが気に入っています: - http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace

また、重複除外機能を広範囲に使用して、SMTP 経由で毎日約 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

ありがとう!

于 2014-11-12T18:45:44.750 に答える
27

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

sed -c s/FOO/BAR/g filename
于 2008-09-12T21:57:06.533 に答える
16

WindowsでGit を使用する場合は、起動しgit-bash て使用するだけsedです。または、Windows 10 を使用している場合は、「Bash on Ubuntu on Windows」を (Linux サブシステムから) 起動し、sed.

これはストリーム エディターですが、次のコマンドを使用してファイルを直接編集できます。

sed -i -e 's/foo/bar/g' filename
  • -iオプションは、ファイル名をその場で編集するために使用されます。
  • -eオプションは、実行するコマンドを示します。
    • s見つかった式「foo」を「bar」gに置き換えるために使用され、見つかった一致を置き換えるために使用されます。

ereOnによるメモ:

Git リポジトリのバージョン管理されたファイルのみの文字列を置き換えたい場合は、次を使用できます。

git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'

これは驚くべきことです。

于 2015-11-17T16:22:57.727 に答える
14

私はここで既存の答えのいくつかをいじって、私の改善された解決策を好みます...

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

于 2012-05-08T00:00:04.920 に答える
13

私は 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
于 2010-12-09T19:33:32.460 に答える
7

Is there any sed like utility for cmd.exeを見てください。これは、Windows で同等の sed を要求しましたが、この質問にも適用する必要があります。エグゼクティブサマリー:

  • バッチファイルで実行できますが、きれいではありません
  • exeをインストールするか、コピーするだけの余裕がある場合は、多くの利用可能なサードパーティの実行可能ファイルがあなたのためにそれを行います
  • Windowsボックスで変更せずに実行できるものが必要な場合は、VBScriptなどで実行できます。
于 2008-10-14T20:19:08.177 に答える
5

関数を提供する 2 つのバッチ ファイルはsearch and replace、Stack Overflow メンバーによって作成され、Windowsdbenhamaacini使用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スイッチと他の多くの機能があります。

于 2014-07-22T12:52:16.847 に答える
5

パワーシェルコマンドは魅力のように機能します

(
test.txt | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt
)
于 2010-07-22T13:41:19.990 に答える
4

少し遅れているかもしれませんが、ソフトウェアの承認を取得するという苦痛を経験したくないので、私はよく似たようなものを探しています。

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

于 2009-12-23T16:20:39.060 に答える
3

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

それで、グーグルをしている間:)私は素晴らしいツールを見つけました-FAR (検索と置換)(FARTではありません)。

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

于 2015-08-04T14:43:51.227 に答える
2

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

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

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

于 2008-09-17T17:58:08.923 に答える
1

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

あなたの最善の策:sed

于 2008-09-12T22:23:08.547 に答える
-1

Notepad ++は、「ファイル内を検索」コマンドを使用して、これをすべて実行します。

ここに画像の説明を入力

ここに画像の説明を入力

于 2021-08-20T21:22:21.060 に答える