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?
492
echo(%text:%search%=%replace%%)
Antworten:
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:
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 vonmyFile.txt
(gc
steht für denGet-Content
Befehl)-replace 'foo', 'bar'
perlt einfach das ersetzen Befehl ersetzenfoo
mitbar
| Out-File myFile.txt
leitet die Ausgabe an die Datei weitermyFile.txt
-encoding ASCII
verhindert das Transkribieren der Ausgabedatei in Unicode, wie die Kommentare zeigenPowershell.exe sollte bereits Teil Ihrer PATH-Anweisung sein, aber wenn nicht, können Sie sie hinzufügen. Der Speicherort auf meinem Computer ist
C:\WINDOWS\system32\WindowsPowerShell\v1.0
quelle
-encoding ASCII
oderUTF8
oder 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.-encoding ASCII
. Für alle, die es in Zukunft brauchen, wäre esOut-File -encoding ASCII myFile.txt
Set-Content
stattOut-File
.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.
quelle
powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | sc myFile.txt"
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:
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
quelle
/
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/
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.
Skriptausgabe:
Ref: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace
quelle
Erstellen Sie die Datei replace.vbs:
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 "
quelle
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
.BatchSubstitute.bat
Auf dostips.com finden Sie ein Beispiel für das Suchen und Ersetzen mithilfe einer reinen Batchdatei.Es verwendet eine Kombination von
FOR
,FIND
undCALL SET
.Zeilen, die Zeichen enthalten, werden
"&<>]|^
möglicherweise falsch behandelt.quelle
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
/UTF
Option 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:
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
M
undX
ermöglicht beispielsweise das Ändern von Binärdateien! DieM
Option Mehrzeilig ermöglicht die Suche über mehrere Zeilen hinweg. DieX
Option 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.
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:
Wie immer ist die vollständige Dokumentation in das Skript eingebettet.
Die ursprüngliche triviale Lösung ist jetzt noch einfacher:
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.
quelle
\q
der Darstellung erweitert"
, und Suchliterale unterstützen jetzt alle erweiterten Escape-Sequenzen, wenn L- und X-Optionen kombiniert werden.Verwenden Sie FNR
Verwenden Sie das
fnr
Dienstprogramm. Es hat einige Vorteile gegenüberfart
: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"
quelle
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
sed
Befehl verwenden (oder nur herunterladensed
):quelle
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 konvertiertIch 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:
DEDUPLIKATOR (beachten Sie die Verwendung von -9 für eine ABA-Nummer):
Vielen Dank!
quelle
Wenn Sie mit Git unter Windows arbeiten, starten Sie es einfach
git-bash
und verwenden Sie essed
. Oder starten Sie unter Windows 10 "Bash unter Ubuntu unter Windows" (vom Linux-Subsystem) und verwenden Siesed
.Es ist ein Stream-Editor, kann jedoch Dateien direkt mit dem folgenden Befehl bearbeiten:
-i
Option wird verwendet, um den Dateinamen zu bearbeiten.-e
Option gibt einen auszuführenden Befehl an.s
wird verwendet, um den gefundenen Ausdruck "foo" durch "bar"g
zu 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.
quelle
git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'
Wunder wirkt.Ich habe mit einigen der vorhandenen Antworten hier herumgespielt und bevorzuge meine verbesserte Lösung ...
oder wenn Sie die Ausgabe erneut in einer Datei speichern möchten ...
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 ... :-(
quelle
type
bedeutet die Verwendung, dass alle Zeilen mit mehr als 80 Zeichen umbrochen werden. Was für ein Schmerz.Ich habe Perl benutzt, und das funktioniert wunderbar.
.orig ist die Erweiterung, die an die Originaldatei angehängt wird
Für eine Reihe von übereinstimmenden Dateien wie * .html
quelle
sed
mitperl -pi.backup -e
und schätzen es :)Mit der replace.bat
1) Mit
e?
Option, die Sonderzeichenfolgen wie\n\r
und Unicode-Sequenzen auswertet . In diesem Fall wird zitiert zitiert"Foo"
und"Bar"
:2) Einfaches Ersetzen, wenn die
Foo
undBar
nicht angegeben sind.quelle
Hier ist eine Lösung, die unter Win XP funktioniert hat. In meine laufende Batch-Datei habe ich Folgendes aufgenommen:
Die
replace.bat
Datei ist wie folgt. Ich habe keine Möglichkeit gefunden, diese Funktion in dieselbe Batchdatei aufzunehmen, da die%%a
Variable immer den letzten Wert in der for-Schleife zu geben scheint.replace.bat
::quelle
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:
quelle
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.
quelle
Zwei Batch - Dateien , dass die Versorgungsfunktionen
search and replace
geschrieben wurden von Stack - Überlauf - Mitgliederndbenham
undaacini
mitnative built-in jscript
in Windows.Sie sind beides
robust
und werdenvery swift with large files
mit einfachem Batch-Scripting verglichen und dienen auchsimpler
zum einfachen Ersetzen von Text. Sie haben beideWindows regular expression
Musterabgleich.Diese
sed-like
Helfer-Batch-Datei wirdrepl.bat
(von dbenham) aufgerufen.Beispiel mit dem
L
Literalschalter:Diese
grep-like
Helfer-Batch-Datei wirdfindrepl.bat
(von aacini) aufgerufen.Beispiel mit aktiven regulären Ausdrücken:
Beide werden zu leistungsstarken systemweiten Dienstprogrammen
when placed in a folder that is on the path
oder können im selben Ordner mit einer Batchdatei oder über die Eingabeaufforderung cmd verwendet werden.Sie haben beide
case-insensitive
Schalter und auch viele andere Funktionen.quelle
Power Shell Befehl funktioniert wie ein Zauber
quelle
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).
quelle
Ich bevorzuge die Verwendung
sed
von GNU-Dienstprogrammen für Win32 . Folgendes muss beachtet werdenDer Arbeitscode
sed
zum Suchen und Ersetzen von Text in einer Datei in Windows lautet also wie folgtquelle
-i
! Wenn dies bei Ihrer sed-Version der Fall ist, überprüfen Sie den Befehl in dieser Antwort: stackoverflow.com/a/33762001/2492801 .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
@Rachel gab eine ausgezeichnete Antwort, aber hier ist eine Variation davon, um Inhalte in eine Powershell-
$data
Variable 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.quelle
Verwenden Sie Powershell in .bat - für Windows 7+
Die Codierung von utf8 ist optional und eignet sich für Websites
quelle
Laden Sie Cygwin (kostenlos) herunter und verwenden Sie Unix-ähnliche Befehle in der Windows-Befehlszeile.
Ihre beste Wette: sed
quelle
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.
quelle
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.
quelle