Wie können Sie Text in einer Datei mithilfe der Windows-Befehlszeilenumgebung finden und ersetzen?

492

Ich schreibe ein Batch-Dateiskript in einer Windows-Befehlszeilenumgebung und möchte jedes Vorkommen von Text in einer Datei (z. B. "FOO") durch ein anderes (z. B. "BAR") ändern. Was ist der einfachste Weg, das zu tun? Irgendwelche eingebauten Funktionen?

Strahl
quelle
Verwenden Sie dies:echo(%text:%search%=%replace%%)
Wissenschaftler_7

Antworten:

308

Viele der Antworten hier haben mir geholfen, in die richtige Richtung zu weisen, aber keine war für mich geeignet, deshalb veröffentliche ich meine Lösung.

Ich habe Windows 7, das mit PowerShell integriert ist. Hier ist das Skript, mit dem ich alle Textinstanzen in einer Datei gefunden / ersetzt habe:

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

Um es zu erklären:

  • powershell Startet Powershell.exe, das in Windows 7 enthalten ist
  • -Command "... " ist ein Befehlszeilenargument für Powershell.exe, das den auszuführenden Befehl enthält
  • (gc myFile.txt)liest den Inhalt von myFile.txt( gcsteht für den Get-ContentBefehl)
  • -replace 'foo', 'bar'perlt einfach das ersetzen Befehl ersetzen foomitbar
  • | Out-File myFile.txt leitet die Ausgabe an die Datei weiter myFile.txt
  • -encoding ASCII verhindert das Transkribieren der Ausgabedatei in Unicode, wie die Kommentare zeigen

Powershell.exe sollte bereits Teil Ihrer PATH-Anweisung sein, aber wenn nicht, können Sie sie hinzufügen. Der Speicherort auf meinem Computer istC:\WINDOWS\system32\WindowsPowerShell\v1.0

Rachel
quelle
71
Beachten Sie, dass dieser Befehl die Datei möglicherweise auch in Unicode-Codierung umcodiert. Sie können manuell die Codierung angeben , indem Sie das Hinzufügen -encoding ASCIIoder UTF8oder was auch immer nötig ist. Beachten Sie auch, dass bei der Ausrichtung auf UTF8 möglicherweise am Anfang der Datei ein Byte Order Mark eingefügt wird, das nicht im Original enthalten war.
Wyck
78
@ Wyck Ich habe eine Weile gebraucht, um herauszufinden, wo ich es hinstellen soll -encoding ASCII. Für alle, die es in Zukunft brauchen, wäre esOut-File -encoding ASCII myFile.txt
rwilson04
15
Das einzige, was ich ändern musste, war zu verwenden Set-Contentstatt Out-File.
Kurtzmarc
6
Dies funktioniert, aber die Leistung ist selbst bei einer kurzen Liste von Dateien schrecklich.
jsuddsjr
23
Beachten Sie, dass das Ersetzungstoken (in diesem Fall 'foo') als regulärer Ausdruck behandelt wird. Wenn Sie dort Sonderzeichen haben (ich hatte []), müssen Sie ihnen einen \ (Backslash) voranstellen.
JW
183

Wenn Sie eine Windows-Version verwenden, die .Net 2.0 unterstützt, würde ich Ihre Shell ersetzen. PowerShell bietet Ihnen die volle Leistung von .Net über die Befehlszeile. Es sind auch viele Commandlets eingebaut. Das folgende Beispiel löst Ihre Frage. Ich verwende die vollständigen Namen der Befehle, es gibt kürzere Aliase, aber dies gibt Ihnen etwas für Google.

(Get-Content test.txt) | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt
Mike Schall
quelle
10
Ich kann sehen, dass PowerShell dies erreichen kann. Aber wie kann ich dies aus einer Batch-Datei ausführen lassen (Beispiel: myProc.bat)?
Pablo Venturino
3
@Pablo, verwenden Sie Powershell.exe und wickeln Sie den Befehl ps in einen einzelnen Parameter ein
lubos hasko
56
-1 .. Sicher, die Antwort wurde akzeptiert, aber es ist keine Antwort auf die angegebene Frage.
baash05
28
Dies schlägt mit einem Fehler in der verwendeten Datei fehl, wenn Sie in derselben Datei speichern. Sie müssen den Powershell-Befehl in Folgendes ändern: (Get-Content test.txt) | ForEach-Object {$ _ -replace "foo", "bar"} | Set-Content test.txt
BigMomma
6
Siehe die Antwort von @Rachel:powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | sc myFile.txt"
Nigel Touch
161

Gerade verwendetes FART ( Befehlszeilenprogramm " F ind A nd R eplace T ext"):
Hervorragende kleine Freeware zum Ersetzen von Text in einer großen Anzahl von Dateien.

Die Setup-Dateien befinden sich auf SourceForge .

Anwendungsbeispiel:

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

zeigt eine Vorschau der zu rekursiven Ersetzungen in den Dateien dieser Perl-Distribution an.

Einziges Problem: Das FART-Website-Symbol ist nicht gerade geschmackvoll, raffiniert oder elegant;)


Update 2017 (7 Jahre später) jagb weist in den Kommentaren zum Artikel " FARTing the Easy Way - Finden und Ersetzen von Text " von Mikail Tunç aus dem Jahr 2011 darauf hin

VonC
quelle
19
Das Coole ist, dass es eine einzige Exe ist. Keine Abhängigkeiten. Keine kleinen Drucke. Super einfach zu implementieren.
Serge Wautier
2
Sehr leicht und einfach zu bedienen, aber ich hatte gehofft, dass es die genauen Orte ausdrucken würde, an denen der Austausch stattfand. Das nicht sehen zu können, gab mir ein Gefühl der Unsicherheit.
William Niu
4
Danke, es ist perfekt, sollte Teil der Standard-Dos-Tools sein und hat einen Zauber gewirkt. Die Option -p zeigt Ihnen jedoch nicht an, wie viele Änderungen sie vornehmen würde, und meldet immer 0, was mich für ein paar Minuten
geworfen hat
3
Ich verstehe, dass dies eine sehr alte Frage ist, aber ich habe weitere Informationen gefunden und hoffe, dass sie für Stack Overflow-Benutzer hilfreich sind. Nur ein weiterer Link für FART, wo das Produkt gut erklärt wird: FART erklärt @ emtunc.org und eine andere Seite finden Sie hier: FART Bitte seien Sie vorsichtig beim Ersetzen von /und 'da dies nicht für alle von uns funktioniert , hat es bei einigen in mir funktioniert Fälle, aber es hat bei einigen Dateien nicht funktioniert und ich weiß nicht warum .. Ich habe dies verwendet, um Text durch anderen Text und a/
jagb
4
@ Jagb Danke. Ich habe Ihren Link in die Antwort aufgenommen, um die Sichtbarkeit zu verbessern.
VonC
128

Ersetzen - Ersetzen eines Teilstrings durch Ersetzen von Zeichenfolgen Beschreibung: Um einen Teilstring durch einen anderen String zu ersetzen, verwenden Sie die Funktion zum Ersetzen von Zeichenfolgen. Das hier gezeigte Beispiel ersetzt alle Vorkommen "der" Rechtschreibfehler durch "the" in der Zeichenfolgenvariablen str.

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

Skriptausgabe:

teh cat in teh hat
the cat in the hat

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

Bill Richardson
quelle
30
Wie ist der sed Vorschlag besser? Dies scheint die einfachste Antwort von allen zu sein und erfordert die Installation von nichts.
DonBecker
5
Kann hier irgendeine Art von Mustervergleich durchgeführt werden? Platzhalter, Regex usw.?
Keyo
27
"Wie ist der sed Vorschlag besser?" - sed und ähnliche Dienstprogramme arbeiten mit Dateien; In diesem Snippet wird der wichtige Schritt des Lesens von Zeilen aus der Eingabedatei und des Schreibens in die Ausgabedatei weggelassen, während sichergestellt wird, dass alle Sonderzeichen in der Datei korrekt behandelt werden.
Joe
7
@Asad, ja das stimmt, das OP hat nach Dateien gefragt, aber tatsächlich funktioniert es mit Streams, die keine Dateien sein müssen. Mein Punkt hier ist jedoch, dass diese Antwort fehlerhaft ist, da sie das Lesen / Schreiben aus einem Stream und das Behandeln von Sonderzeichen unterlässt.
Joe
4
@ Bill, wie man Variable als Ersatztext verwendet? dh. Ich habe Wert in einer Variablen und einer Zeichenfolge, die ein Trennzeichen hat. set str =% str: "##" =% varValue %% funktioniert nicht. Problemumgehungen?
MalTec
55

Erstellen Sie die Datei 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

Um dieses überarbeitete Skript (das wir replace.vbs nennen) zu verwenden, geben Sie einfach einen ähnlichen Befehl an der Eingabeaufforderung ein:

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

user459118
quelle
Das ist ordentlich, erlaubt es die Verwendung von RegEx?
user280109
3
@ user280109 Ja, VBScript unterstützt RegExp. Sie können dies verwenden, um durch einen regulären Ausdruck zu ersetzen : With (New RegExp): strNewText = .Replace(strText, strOldText, strNewText): End With. Sie können den Text der ersten 9 einfangenden Gruppen bekommen mit $1, $2... $9.
Zahnbürste
2
VBScript wird oft übersehen (und gehasst), ist aber auf allen Windows-Plattformen verfügbar, sehr gut lesbar und verfügt über sehr leistungsfähige Funktionen +1
zelanix
1
@ user280109 Du hast gerade den Befehl gegeben, was ich brauche. Aber ich möchte ersetzen (ohne Berücksichtigung der Groß- und Kleinschreibung) Können Sie den Befehl dafür bereitstellen?
Ajmal Praveen
49

BatchSubstitute.batAuf dostips.com finden Sie ein Beispiel für das Suchen und Ersetzen mithilfe einer reinen Batchdatei.

Es verwendet eine Kombination von FOR, FINDund CALL SET.

Zeilen, die Zeichen enthalten, werden "&<>]|^möglicherweise falsch behandelt.


morechilli
quelle
8
Ich muss die Nützlichkeit einer Code-Snippet-Site in Frage stellen, deren Nutzungsbedingungen das Kopieren von Code verbieten ("Sie dürfen ohne die ausdrückliche schriftliche Genehmigung des Domain-Inhabers keine unter der Domain dostips.com bereitgestellten Informationen in irgendeiner Form verbreiten.") .
Gilles 'SO - hör auf böse zu sein'
1
Ich bin damit einverstanden, dass ihre Bedingungen verwirrend sind. Sie sagen auch "Die unter der Domain dostips.com bereitgestellten Informationen sind hoffentlich nützlich". Ich gehe daher davon aus, dass sie sich freuen, wenn die Leute den Code kopieren, um ein Problem zu lösen. Ich bin nicht sicher, ob ich jemals irgendwelche Geschäftsbedingungen gelesen habe und glücklich war ...
morechilli
5
Das ist toll. Ich liebe Antworten, bei denen es nicht darum geht, etwas anderes herunterzuladen, um dies zu tun.
Ruairi O'Brien
Ich mag auch Lösungen, die keine externen Dienstprogramme beinhalten. Leider erhalte ich immer wieder "find: ungültiges Prädikat", wenn ich versuche, diesen Stapel auszuführen. Ich habe momentan nicht wirklich die Zeit, es zu debuggen.
Jahmic
2
Der Fehler "find: ungültiges Prädikat" war auf ein externes Dienstprogramm "find" auf meinem System zurückzuführen. Einmal entfernt, funktionierte dies gut.
Jahmic
47

Hinweis - Stellen Sie sicher, dass Sie das Update am Ende dieser Antwort finden, um einen Link zum übergeordneten JREPL.BAT zu erhalten, der REPL.BAT ersetzt.
JREPL.BAT 7.0 und höher unterstützt nativ Unicode (UTF-16LE) über die /UTFOption sowie alle anderen anderer Zeichensatz, einschließlich UTF-8, über ADO !!!!


Ich habe ein kleines hybrides JScript / Batch-Dienstprogramm namens REPL.BAT geschrieben , das sehr praktisch ist, um ASCII-Dateien (oder erweiterte ASCII-Dateien) über die Befehlszeile oder eine Batch-Datei zu ändern . Das rein native Skript erfordert keine Installation von ausführbaren Dateien von Drittanbietern und funktioniert auf jeder modernen Windows-Version ab XP. Es ist auch sehr schnell, insbesondere im Vergleich zu reinen Batch-Lösungen.

REPL.BAT liest einfach stdin, führt eine JScript-Regex-Suche und Ersetzung durch und schreibt das Ergebnis in stdout.

Hier ist ein triviales Beispiel, wie Sie foo in test.txt durch bar ersetzen können, vorausgesetzt, REPL.BAT befindet sich in Ihrem aktuellen Ordner oder noch besser irgendwo in Ihrem PATH:

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

Die JScript-Regex-Funktionen machen es sehr leistungsfähig, insbesondere die Fähigkeit des Ersatztextes, erfasste Teilzeichenfolgen aus dem Suchtext zu referenzieren.

Ich habe eine Reihe von Optionen in das Dienstprogramm aufgenommen, die es ziemlich leistungsfähig machen. Das Kombinieren der Optionen Mund Xermöglicht beispielsweise das Ändern von Binärdateien! Die MOption Mehrzeilig ermöglicht die Suche über mehrere Zeilen hinweg. Die XOption eXtended Substitution Pattern bietet Escape-Sequenzen, mit denen beliebige Binärwerte in den Ersetzungstext aufgenommen werden können.

Das gesamte Dienstprogramm könnte als reines JScript geschrieben worden sein, aber die Hybrid-Batchdatei macht es nicht mehr erforderlich, CSCRIPT jedes Mal explizit anzugeben, wenn Sie das Dienstprogramm verwenden möchten.

Hier ist das REPL.BAT-Skript. Die vollständige Dokumentation ist in das Skript eingebettet.

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


WICHTIGES UPDATE

Ich habe die Entwicklung von REPL.BAT eingestellt und durch JREPL.BAT ersetzt. Dieses neuere Dienstprogramm bietet alle Funktionen von REPL.BAT und vieles mehr:

  • Unicode-UTF-16LE-Unterstützung über native CSCRIPT-Unicode-Funktionen und alle anderen Zeichensätze (einschließlich UTF-8) über ADO.
  • Direkt aus einer Datei lesen / direkt in eine Datei schreiben: Pipes, Umleitung oder Verschieben sind nicht erforderlich.
  • Integrieren Sie vom Benutzer bereitgestelltes JScript
  • Die Übersetzungsfunktion ähnelt Unix Tr, unterstützt jedoch auch die Regex-Suche und das Ersetzen von JScript
  • Nicht übereinstimmenden Text verwerfen
  • Stellen Sie den Ausgabezeilen die Zeilennummer voran
  • und mehr...

Wie immer ist die vollständige Dokumentation in das Skript eingebettet.

Die ursprüngliche triviale Lösung ist jetzt noch einfacher:

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

Die aktuelle Version von JREPL.BAT ist bei DosTips erhältlich . Lesen Sie alle nachfolgenden Beiträge im Thread, um Anwendungsbeispiele und einen Verlauf der Entwicklung zu sehen.

Dbenham
quelle
Tolles Zeug! Ich liebe dieses B / C der Einfachheit und der Art und Weise, wie Sie es an jedes Skript anpassen können, und schreibe daher JS-Code als beschissenen Stapel.
Adaptabi
Bearbeiten - Die Option A wurde hinzugefügt, um nur geänderte Zeilen zu drucken. Außerdem wurde die X-Option zur Unterstützung \qder Darstellung erweitert ", und Suchliterale unterstützen jetzt alle erweiterten Escape-Sequenzen, wenn L- und X-Optionen kombiniert werden.
Dbenham
@dbenham - +1. Dies ist ein geschickter Ansatz, der sich auch für einige andere Aufgaben als nützlich erweisen wird. Danke, dass du es gepostet hast.
bw
BEARBEITEN - Ich habe das Verhalten von \ xnn geändert, wenn die Option X verwendet wird, sodass der Code den erweiterten ASCII-Bytecode darstellt. Außerdem wurde eine / V-Versionsoption hinzugefügt.
Dbenham
9
@dbenham Dies ist ein Juwel. Warum stellst du es nicht auf GitHub oder als Gist auf? Dies würde die Versionierung, Nachverfolgung, Veröffentlichung / Verteilung, Korrekturen und mehr vereinfachen. Wenn Sie dabei Hilfe benötigen, lassen Sie es mich wissen.
Atif Aziz
36

Verwenden Sie FNR

Verwenden Sie das fnrDienstprogramm. Es hat einige Vorteile gegenüber fart:

  • Reguläre Ausdrücke
  • Optionale GUI. Verfügt über eine "Befehlszeilentaste generieren" zum Erstellen von Befehlszeilentext zum Einfügen in eine Batchdatei.
  • Mehrzeilige Muster: Über die GUI können Sie problemlos mit mehrzeiligen Mustern arbeiten. In FART müssten Sie Zeilenumbrüche manuell umgehen.
  • Ermöglicht die Auswahl der Textdatei-Codierung. Hat auch eine automatische Erkennungsoption.

Laden Sie FNR hier herunter: http://findandreplace.io/?z=codeplex

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

Ein Mann
quelle
1
Das ist nett. Die Befehlszeile über die GUI generieren zu können, ist eine nette, einfache Funktion, die mich schnell zum Laufen gebracht hat.
David Hammond
Sehr nützliches Werkzeug. Versuchte FART vorher, aber die Dokumentation ist veraltet.
Artur Kędzior
Cooles Tool, es unterstützt sogar reguläre Ausdrücke. Dies ist etwas, das FART fehlt.
Dio Phung
1
Vielen Dank für die Angabe dieses Tools. Single exe, großartiger Ersatz für FART, der nicht mehr entwickelt wurde (und Regex vermisst); und PowerShell-Syntax ist sooo unerträglich.
Gras Double
Dies ist am nützlichsten. War auf der Suche nach grep + sed Ersatz in Windows, das hat super funktioniert!
Serban Tanasa
25

Ich glaube nicht, dass es eine Möglichkeit gibt, dies mit eingebauten Befehlen zu tun. Ich würde vorschlagen, dass Sie etwas wie Gnuwin32 oder UnxUtils herunterladen und den sedBefehl verwenden (oder nur herunterladen sed):

sed -c s/FOO/BAR/g filename
Ferruccio
quelle
2
Verwenden Sie cygwin ( cygwin.com ). Es ist das nächstbeste, um Linux tatsächlich zu installieren.
Andrew Johnson
Es ist besser, wenn man eine Lösung anbieten kann, die nicht auf der Installation von Cygwin beruht. Die Manipulation von POSIX-Zeichenfolgen ist ein Kinderspiel - dies unter Windows ist etwas unklarer.
Rex
4
Gnuwin32 und UnxUtils sind eigenständige Binärdateien für Windows. Sie sind nicht abhängig von Cygwin.
Ferruccio
1
cygwin: sed -i -b -e 's/FOO/BAR/g' `find . -name *.txt`-i - Datei an Ort und Stelle bearbeiten; -b - CR + LF nicht verarbeiten - ohne diese Option würde CR + LF in LF konvertiert
Alexey Vishentsev
@ AndrewJohnson Meinung und Information sind zwei verschiedene Dinge.
Preza8
21

Ich weiß, ich bin zu spät zur Party.

Persönlich gefällt mir die Lösung unter: - http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace

Wir verwenden die Dedupe-Funktion auch ausgiebig, um täglich ca. 500 E-Mails über SMTP zu versenden: - https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o

und beide funktionieren nativ ohne zusätzliche Tools oder Dienstprogramme.

ERSATZER:

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

DEDUPLIKATOR (beachten Sie die Verwendung von -9 für eine ABA-Nummer):

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

Vielen Dank!

Leptonator
quelle
Das Batch-Skript macht nichts anderes als eine bloße Dateikopie - auch: Warum bedanken Sie sich?
Spezialisiert
Die ursprüngliche Anforderung bestand darin, "FOO" in einer Textdatei mithilfe eines Batch-Skripts und mit vorzugsweise integrierten Funktionen durch "BAR" zu ersetzen. Wenn überhaupt, habe ich mich bei dem Google Groups-Beitrag bedankt, den ich gefunden habe und der fantastisch funktioniert, und wir verwenden ihn bis heute. Sehen Sie auch Beiträge und Antworten wie diese als hilfreich für Benutzer an, die später auf die Straße kommen. Ich sehe Ihren Kommentar zur Dateikopie nicht. Sicher, er nimmt den Inhalt einer Datei und gibt das Ergebnis in eine andere Datei zurück, aber basierend auf den Daten werden die erforderlichen Informationen abgeschnitten und analysiert. Ich würde empfehlen, es zuerst zu versuchen. ;)
Leptonator
Es handelt sich im Grunde genommen um ein Dateikopierwerkzeug, das zwei statische Zeichenfolgen ersetzt. Sie hätten mindestens zwei Variablen darin platzieren können , damit Benutzer , die es ausprobieren möchten , die Syntax nicht verstehen müssen, um sie tatsächlich verwenden zu können. Annahmen über das Internet sind fast immer völlig falsch. Erinnere dich daran.
Spezialisiert
4
@specializt - Bitte ... Ich bin nicht hier, um über Semantik zu diskutieren. Wenn Sie möchten, können wir dies offline in den Chatraum bringen.
Leptonator
2
Meiner Meinung nach ist dies die Antwort auf die ursprüngliche Frage. Ich werde diesen Tipp verwenden, um Initialisierungsdateien für einen Dienst während des Setups zu konfigurieren, und ich möchte PowerShell nicht aktivieren oder zulassen, dass die Skript-Engine auf meinen Servern ausgeführt wird. So oft Antworten auf Fragen im Zusammenhang mit Windows, beginnen Sie mit "Installieren Sie dieses Gizmo von dort", da es immer noch eine "PC" -Haltung gibt.
Mico
15

Wenn Sie mit Git unter Windows arbeiten, starten Sie es einfach git-bash und verwenden Sie es sed. Oder starten Sie unter Windows 10 "Bash unter Ubuntu unter Windows" (vom Linux-Subsystem) und verwenden Sie sed.

Es ist ein Stream-Editor, kann jedoch Dateien direkt mit dem folgenden Befehl bearbeiten:

sed -i -e 's/foo/bar/g' filename
  • -i Option wird verwendet, um den Dateinamen zu bearbeiten.
  • -e Option gibt einen auszuführenden Befehl an.
    • swird verwendet, um den gefundenen Ausdruck "foo" durch "bar" gzu ersetzen, und wird verwendet, um gefundene Übereinstimmungen zu ersetzen.

Anmerkung von ereOn:

Wenn Sie eine Zeichenfolge nur in versionierten Dateien eines Git-Repositorys ersetzen möchten, möchten Sie möglicherweise Folgendes verwenden:

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

Das wirkt Wunder.

Jens A. Koch
quelle
1
Beachten Sie, dass Sie, wenn Sie diese Umbenennung in einem Git-Repository tatsächlich durchführen und nur in versionierten Dateien ersetzen möchten, möglicherweise Folgendes tun möchten: Was git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'Wunder wirkt.
am
13

Ich habe mit einigen der vorhandenen Antworten hier herumgespielt und bevorzuge meine verbesserte Lösung ...

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

oder wenn Sie die Ausgabe erneut in einer Datei speichern möchten ...

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

Dies hat den Vorteil, dass Sie die Ausgabe von jedem Programm aus weiterleiten können. Ich werde mich auch mit der Verwendung regulärer Ausdrücke befassen. Es konnte jedoch nicht herausgefunden werden, wie es zur einfacheren Verwendung in eine BAT-Datei umgewandelt werden kann ... :-(

Simon East
quelle
3
Dies ist eine gute Lösung. Leider typebedeutet die Verwendung, dass alle Zeilen mit mehr als 80 Zeichen umbrochen werden. Was für ein Schmerz.
Sirdank
12

Ich habe Perl benutzt, und das funktioniert wunderbar.

perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" <fileName>

.orig ist die Erweiterung, die an die Originaldatei angehängt wird

Für eine Reihe von übereinstimmenden Dateien wie * .html

for %x in (<filePattern>) do perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" %x
Faisal
quelle
Dies ist die einfachste Lösung +1, wenn sie von sh zu schlagen Umwandlung, ersetzen Sie einfach sedmit perl -pi.backup -eund schätzen es :)
Yann39
11

Mit der replace.bat

1) Mit e?Option, die Sonderzeichenfolgen wie \n\rund Unicode-Sequenzen auswertet . In diesem Fall wird zitiert zitiert "Foo"und "Bar":

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

2) Einfaches Ersetzen, wenn die Foound Barnicht angegeben sind.

call replacer.bat "C:\content.txt" "Foo" "Bar"
npocmaka
quelle
es funktioniert nicht für mich. Wie läuft das? Ich erhalte die Fehlermeldung 'replace_in_config.bat' wird nicht als interner oder externer Befehl, bedienbares Programm oder Batchdatei erkannt.
FrenkyB
@FrenkyB - es muss sich in demselben Verzeichnis befinden, in dem Sie es aufrufen, oder im Pfad - ss64.com/nt/path.html
npocmaka
Ich habe alle drei Dateien im selben Verzeichnis gehabt.
FrenkyB
9

Hier ist eine Lösung, die unter Win XP funktioniert hat. In meine laufende Batch-Datei habe ich Folgendes aufgenommen:

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

Die replace.batDatei ist wie folgt. Ich habe keine Möglichkeit gefunden, diese Funktion in dieselbe Batchdatei aufzunehmen, da die %%aVariable immer den letzten Wert in der for-Schleife zu geben scheint.

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
Tschad
quelle
1
Leider überspringt dies auch leere Zeilen. Eine Funktion des Befehls {{for}}.
John Rocha
7

Werfen Sie einen Blick auf Gibt es ein Dienstprogramm wie sed für cmd.exe, das unter Windows nach einem sed-Äquivalent gefragt hat, sollte dies auch für diese Frage gelten. Zusammenfassung:

  • Es kann in Batch-Datei gemacht werden, aber es ist nicht schön
  • Viele verfügbare ausführbare Dateien von Drittanbietern, die dies für Sie erledigen, wenn Sie den Luxus haben, eine Exe zu installieren oder einfach nur zu kopieren
  • Kann mit VBScript oder ähnlichem durchgeführt werden, wenn Sie etwas benötigen, das auf einer Windows-Box ohne Änderungen usw. ausgeführt werden kann.
Jay
quelle
4

Es mag ein bisschen spät sein, aber ich suche häufig nach ähnlichen Dingen, da ich nicht durch den Schmerz kommen möchte, Software genehmigt zu bekommen.

Normalerweise verwenden Sie die FOR-Anweisung jedoch in verschiedenen Formen. Jemand hat eine nützliche Batchdatei erstellt, die sucht und ersetzt. Schauen Sie hier . Es ist wichtig, die Einschränkungen der bereitgestellten Batchdatei zu kennen. Aus diesem Grund kopiere ich den Quellcode in dieser Antwort nicht.

Peter Schuetze
quelle
4

Zwei Batch - Dateien , dass die Versorgungsfunktionensearch and replace geschrieben wurden von Stack - Überlauf - Mitgliedern dbenhamund aacinimit native built-in jscriptin Windows.

Sie sind beides robustund werden very swift with large filesmit einfachem Batch-Scripting verglichen und dienen auch simplerzum einfachen Ersetzen von Text. Sie haben beide Windows regular expressionMusterabgleich.

  1. Diese sed-likeHelfer-Batch-Datei wird repl.bat(von dbenham) aufgerufen.

    Beispiel mit dem LLiteralschalter:

    echo This is FOO here|repl "FOO" "BAR" L
    echo and with a file:
    type "file.txt" |repl "FOO" "BAR" L >"newfile.txt"
    
  2. Diese grep-likeHelfer-Batch-Datei wird findrepl.bat(von aacini) aufgerufen.

    Beispiel mit aktiven regulären Ausdrücken:

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

Beide werden zu leistungsstarken systemweiten Dienstprogrammen when placed in a folder that is on the pathoder können im selben Ordner mit einer Batchdatei oder über die Eingabeaufforderung cmd verwendet werden.

Sie haben beide case-insensitiveSchalter und auch viele andere Funktionen.

foxidrive
quelle
3

Power Shell Befehl funktioniert wie ein Zauber

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

Ich hatte gerade ein ähnliches Problem: "Suchen und Ersetzen von Text in Dateien", aber mit der Ausnahme, dass ich sowohl für Dateinamen als auch für Suchen / Repalce Regex verwenden muss. Da ich mit Powershell nicht vertraut bin und meine Suchanfragen für die spätere Verwendung speichern möchte, benötige ich etwas "Benutzerfreundlicheres" (vorzuziehen, wenn es über eine grafische Benutzeroberfläche verfügt).

Also, während ich googelte :) Ich fand ein großartiges Tool - FAR (Find And Replace) (nicht FART).

Dieses kleine Programm hat eine schöne GUI und unterstützt Regex für die Suche in Dateinamen und in Dateien. Der einzige Nachteil ist, dass Sie das Programm als Administrator ausführen müssen, wenn Sie Ihre Einstellungen speichern möchten (zumindest unter Win7).

Madcorp
quelle
Es ist die gleiche Antwort wie die Antwort von 2010 @VonC In diesem Thread
jeb
@jeb Ich habe darauf hingewiesen, dass FAR nicht FART ist - zwei verschiedene Programme mit fast identischen Namen. FAR hat GUI und kann mit regex arbeiten, während in den Kommentaren unter diesem Thread Leute erwähnen , dass FART nicht unterstützt Regex.
Madcorp
3

Ich bevorzuge die Verwendung sedvon GNU-Dienstprogrammen für Win32 . Folgendes muss beachtet werden

  • Ein einfaches Anführungszeichen ''funktioniert in Windows nicht. Verwenden Sie ""stattdessen
  • sed -ifunktioniert nicht in Windows, es muss Dateien ausgetauscht werden

Der Arbeitscode sedzum Suchen und Ersetzen von Text in einer Datei in Windows lautet also wie folgt

sed -e "s/foo/bar/g" test.txt > tmp.txt && mv tmp.txt test.txt
Chetabahana
quelle
2
Bevor Windows-Benutzer sofort Dateien austauschen: Neuere Versionen von sed unterstützen die direkte Bearbeitung mit -i! Wenn dies bei Ihrer sed-Version der Fall ist, überprüfen Sie den Befehl in dieser Antwort: stackoverflow.com/a/33762001/2492801 .
Benjamin Bihler
2

Dies ist eine Sache, die Batch-Scripting einfach nicht gut macht.

Das Skript morechilli, mit dem verlinkt ist, funktioniert für einige Dateien, aber leider erstickt es an solchen, die Zeichen wie Pipes und kaufmännisches Und enthalten.

VBScript ist ein besser integriertes Tool für diese Aufgabe. In diesem Artikel finden Sie ein Beispiel: http://www.microsoft.com/technet/scriptcenter/resources/qanda/feb05/hey0208.mspx


quelle
2

@Rachel gab eine ausgezeichnete Antwort, aber hier ist eine Variation davon, um Inhalte in eine Powershell- $dataVariable zu lesen . Sie können den Inhalt dann problemlos mehrmals bearbeiten, bevor Sie in eine Ausgabedatei schreiben. Sehen Sie auch, wie mehrzeilige Werte in .bat-Batchdateien angegeben werden.

@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%"
Wen
quelle
2

Verwenden Sie Powershell in .bat - für Windows 7+

Die Codierung von utf8 ist optional und eignet sich für Websites

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

Laden Sie Cygwin (kostenlos) herunter und verwenden Sie Unix-ähnliche Befehle in der Windows-Befehlszeile.

Ihre beste Wette: sed

jm.
quelle
10
Cygwin ist böse. Installieren Sie es nicht. Verwenden Sie besser die unten genannten UnixUtils.
Zedoo
24
Was ist daran so böse?
jm.
@jm Möglicherweise müssen Sie das Ganze zusammen installieren, anstatt eine einzige ausführbare Datei zu verwenden, wann immer Sie möchten.
Andry
Verwenden Sie Powershell besser, es ist tatsächlich in Windows eingebaut.
Preza8
0

Die Tools Replace und ReplaceFilter finden Sie auch unter https://zoomicon.github.io/tranXform/ (Quelle enthalten). Der zweite ist ein Filter.

Das Tool, das Zeichenfolgen in Dateien ersetzt, befindet sich in VBScript (benötigt Windows Script Host [WSH], um in alten Windows-Versionen ausgeführt zu werden).

Der Filter funktioniert wahrscheinlich nicht mit Unicode, es sei denn, Sie kompilieren mit dem neuesten Delphi (oder mit FreePascal / Lazarus) neu.

George Birbilis
quelle
-5

Ich bin beim Codieren unter Visual C ++ mehrmals auf dieses Problem gestoßen. Wenn Sie es haben, können Sie das Visual Studio-Dienstprogramm zum Suchen und Ersetzen verwenden. Sie können einen Ordner auswählen und den Inhalt einer Datei in diesem Ordner durch einen anderen gewünschten Text ersetzen.

Wählen Sie unter Visual Studio: Bearbeiten -> Suchen und Ersetzen im geöffneten Dialogfeld Ihren Ordner aus und füllen Sie die Felder "Suchen nach" und "Ersetzen durch" aus. Hoffe das wird hilfreich sein.

Nadjib
quelle
2
Nadjib, Ihre Antwort hilft dem Benutzer nicht, weil Sie davon ausgehen, dass er Software verwendet, die er nicht erwähnt. Bitte schlagen Sie eine Option vor, für die keine Software erforderlich ist.
Aibrean
@Aibrean die Antwort nützt nichts, aber nicht aus diesem Grund ist es der falsche Einstiegspunkt.
Paul