m3talh3ad
Goto Top

Suchen und Ersetzen, Kommentare und Leerzeilen behalten

Hallo zusammen,

für viele hier bestimmt ein leichtes Spiel:

Ich möchte in einer ini-Datei per Batch suchen und ersetzen.
Das funktioniert soweit auch, nur werden mir sämtliche Kommentare (angeführt mit Semikolon) und Leerzeilen aus der Quelldatei entfernt. Gibt es einen Weg, das zu unterbinden?

Mittels SuFu bin ich soweit gekommen:
@echo off & setlocal
Set Suchwort=123
Set Ersatz=456
Set Datei=C:\123.ini

If exist %temp%\new.txt del %temp%\new.txt

For /F  "delims=" %%i in (%Datei%) do (  
   Echo %%i|Findstr /B "%Suchwort%" >nul  
   If Errorlevel 1 ( 
          echo %%i>>%temp%\new.txt
	  ) Else (
          echo %Ersatz%>>%temp%\new.txt
))
move %temp%\new.txt %Datei%
Vielen Dank im Voraus!

Content-ID: 240720

Url: https://administrator.de/forum/suchen-und-ersetzen-kommentare-und-leerzeilen-behalten-240720.html

Ausgedruckt am: 12.04.2025 um 13:04 Uhr

bastla
Lösung bastla 12.06.2014 aktualisiert um 22:18:16 Uhr
Goto Top
Hallo M3talH3ad und willkommen im Forum!

Versuch's mal so:
@echo off & setlocal
set "Suchwort=123"  
set "Ersatz=456"  
set "Datei=C:\123.ini"  

set "TempDat=%temp%\new.txt"  
(for /f  "delims=" %%i in ('findstr /n "^" "%Datei%"') do (  
    set "Zeile=%%i"  
    setlocal enabledelayedexpansion
    echo(!Zeile:*:=!|findstr /b "%Suchwort%">nul && (  
        echo %Ersatz%
    ) || (
        echo(!Zeile:*:=!
    )
    endlocal
))>%TempDat%
move %TempDat% "%Datei%"  
Grüße
bastla
M3talH3ad
M3talH3ad 12.06.2014 um 21:41:48 Uhr
Goto Top
Hi bastla!

das scheint zu funktionieren. Vielen Dank!
Wofür ist das "^" in Zeile 7 gut und was bewirkt !Zeile:*:=! genau?
Tue mich gerade schwer damit, das zu verstehen face-smile
bastla
bastla 12.06.2014 um 21:58:50 Uhr
Goto Top
Hallo M3talH3ad!
Wofür ist das "^" in Zeile 7 gut
Das steht für "Zeilenanfang" - und den hat jede Zeile, womit sichergestellt ist, dass alle Zeilen verarbeitet werden.
was bewirkt !Zeile:*:=! genau?
Die Ersetzung des Teils am Anfang der Variablen %Zeile% (bzw, wegen "delayedExpansion", !Zeile!) bis zum ersten ":" (inklusive) durch Nichts - damit wird die Zeilennummer, die "findstr /n" erstellt, abgeschnitten; sollte eine Zeile mit ":" beginnen, wird so nur der erste ":" (stammt von "findstr") entfernt und nicht, wie bei der Alternative
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"') do echo %%j
auch der ursprünglich vorhandene ":" eliminiert.

Zum besseren Verständnis (siehe auch set /? bei "Ersetzen von Umgebungsvariablen"): Wenn in der Datei in Zeile 3 stünde
Wert1=5
enthielte die Variable Zeile zunächst
3:Wert1=5
Ein
echo %Zeile:*:=%
würde dann "3:" entfernen, sodass wieder "Wert=5" ausgegeben würde. Der Sinn der ganzen Aktion ist dabei nur das gewünschte Erhalten der Leerzeilen, da die Nummerierung dafür sorgt, dass in der Schleife jede Zeile verarbeitet wird (es ist ja eine Leerzeile wegen der Nummer zunächst noch nicht "leer", sondern wird es erst wieder durch das Entfernen von Zeilnennummer und ":") ...

Grüße
bastla
M3talH3ad
M3talH3ad 12.06.2014 um 22:17:40 Uhr
Goto Top
Vielen Dank für die ausführliche Erklärung.
Hast mir echt weiter geholfen!

Schönen Abend noch!

LG,
M3talH3ad