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-Key: 240720

Url: https://administrator.de/contentid/240720

Printed on: April 19, 2024 at 09:04 o'clock

Member: bastla
Solution bastla Jun 12, 2014 updated at 20:18:16 (UTC)
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
Member: M3talH3ad
M3talH3ad Jun 12, 2014 at 19:41:48 (UTC)
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
Member: bastla
bastla Jun 12, 2014 at 19:58:50 (UTC)
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
Member: M3talH3ad
M3talH3ad Jun 12, 2014 at 20:17:40 (UTC)
Goto Top
Vielen Dank für die ausführliche Erklärung.
Hast mir echt weiter geholfen!

Schönen Abend noch!

LG,
M3talH3ad