Wie suche und ersetze ich eine Zeichenfolge in mehreren Textdateien (in einem Verzeichnis) mit Windows CMD?

Ich habe mehrere Textdateien in einem Verzeichnis, von denen ich jedes Vorkommen der Zeichenfolge 1 setlinewidth durch 10 setlinewidth ersetzen möchte. Wie mache ich das über Windows cmd? Bitte helfen Sie.

Author: Carla Hook, 2013-11-11

2 answers

Wenn Sie Dienstprogramme von Drittanbietern installieren können, ist Gnu sed für diese Art von Operation maßgeschneidert. Der Link verweist auf eine bei Sourceforge gehostete Windows-Version, die Sie herunterladen und installieren können. Dies wäre die Syntax an der Eingabeaufforderung:

for %i in (*.txt) do sed -i "s/1 setlinewidth/10 setlinewidth/g" %i

Hinweis: Mit der Option -i wird sed die betreffenden Dateien überschreiben, also stellen Sie sicher, dass Sie leicht verfügbare Backups haben, nur für den Fall, dass etwas schief geht.

Wenn Sie das sed-Dienstprogramm nicht installieren können, wird dies viel schwieriger ist es, nur die integrierte Batch-Sprache zu verwenden.

Bearbeiten: Ich habe eine kleine Batch-Datei zusammengestellt, die den Austausch ohne externe Tools durchführt. Speichern Sie es als foo.cmd oder wie auch immer Ihr bevorzugter Name lautet, und rufen Sie es über die Befehlszeile auf als: foo.cmd

Eine Einschränkung: Dies ist sehr speziell aus den Beispielen in Ihrer Frage geschrieben. Wenn am Anfang oder Ende der Zeile vor/nach 1 setlinewidth ein anderer Text oder sogar zusätzliche Leerzeichen vorhanden sind batch-Datei wird nicht funktionieren. Dadurch wird auch eine Kopie der ursprünglichen Textdatei wie bei a gespeichert .bak-Erweiterung (z. B. Textdatei.txt.bak).

@echo off
setlocal ENABLEEXTENSIONS
setlocal ENABLEDELAYEDEXPANSION

for %%a in (*.txt) do (
    echo Processing %%a...
    for /f "delims=^ tokens=1" %%i in (%%a) do (
        if /i "%%i"=="1 setlinewidth" (
            echo 10 setlinewidth>>%%a.new
        ) else (
            echo %%i>>%%a.new
        )
    )
    move /y %%a %%a.bak > nul
    ren %%a.new %%a
)
 6
Author: Scott McKinney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2013-11-11 20:15:38

Powershell verfügt über Dienstprogramme, die dieses Problem lösen, ohne externe Software oder Dienstprogramme herunterzuladen. Check out - mit diesem Artikel durch das Scripting Guy, es ist ziemlich gut. Außerdem würde ich sagen, werfen Sie einen Blick auf die Set-Content Dokumentation.

Beispiel:

(Get-Content C:\Scripts\Test.txt) | Foreach-Object {$_ -replace "oldString", "newString"} | Set-Content C:\Scripts\Test.txt

 8
Author: thisguy123,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-02-01 16:16:22