mafiosi
Goto Top

Batch - IP-Adressen in txt ersetzen

Hallo,

ich möchte eine Batch schreiben, mit der ich in einer txt-Datei IP-Adressen (an beliebigen Stellen in der txt-Datei), durch die IP-Adresse "0.0.0.0" ersetzen kann.
Ich konnte das ganze leider nicht ohne die Tokenfunktion lösen, was mich in der Hinsicht einschränkt, dass ich mich auf bestimmte Token festlegen muss.
Die IP-Adressen befinden meistens im Token 5 oder 6 der unterschiedlichen Zeilen.

Ein Teil des Problem konnte ich durch den unten stehenden Quellcode schon lösen, jedoch ergeben sich folgende Probleme:
- Die IP-Adressen befinden sich zwar meistens an token5 oder token6, aber nicht immer
- Leerzeilen werden gelöscht
- Zeilen in denen es nur ein Wort gibt, werden durch "zeile:=0.0.0.0" ersetzt - der alte Inhalt wird also überschrieben
- die Ausführungsgeschwindigkeit ist relativ langsam

Wie kann ich diese 4 Probleme lösen?
Viele Dank für eure Mühen!


Hier ein kleines Beispiel einer möglichen txt-Datei:
TEST
teil1 teil2 teil3 teil4 10.4.111.1 test6 test7
teil1 teil2 teil3 teil4 teil5 test6 test7
teil1 teil2 teil3 teil4 teil5 0.168.2.223 test7
die zeile bleibt gleich test test test test

teil1 teil2 teil3 teil4 142.0.0.225 test6 test7
teil1 teil2 teil3 teil4 teil5 122.55.0.226 test7
die zeile bleibt gleich test test test test
teil1 teil2 teil3 teil4 4.168.0.228 test6 test7
die zeile bleibt gleich test test test test
teil1 teil2 teil3 teil4 test5 test6 94.23.111.254
teil1 teil2 teil3 teil4 102.168.122.211 test6 test7


Mein bisheriger Code ist:

SETLOCAL enabledelayedexpansion
echo on
SET "quell_datei=C:\temp\test.txt"  
SET "ziel_datei=C:\Temp\neu.txt"  
SET "ersetzen_durch=0.0.0.0"  
echo 
FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO (SET zeile=%%i& CALL :ersetzen !zeile!)  
 
GOTO :weiter
:ersetzen


FOR /F "tokens=5 delims= " %%a IN ("%zeile%") DO (SET token5=%%a)  
echo %token5%

echo %token5%|FINDSTR /R "[0-9].*[0-9].*[0-9].*[0-5]" >NUL &&SET suchen_nach=%token5%  

echo %zeile%
echo .
echo %a%
echo."TOKEN5 ist:"%token5%  
echo."SUCHEN_NACH ist:" %suchen_nach%  

SET zeile=!zeile:%suchen_nach%=%ersetzen_durch%!
IF [!zeile!] EQU  (ECHO.>>%ziel_datei%) ELSE (ECHO !zeile!>>%ziel_datei%) 

Content-Key: 156596

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

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

Member: bastla
bastla Dec 08, 2010 at 15:13:04 (UTC)
Goto Top
Hallo mafiosi und willkommen im Forum!

Wenn Du die eigentliche Arbeit einem VBScript überlässt (wird vom Batch selbst erzeugt), sollte das etwas sicherer sein:
echo on & setlocal
set "quell_datei=C:\temp\test.txt"  
set "ziel_datei=C:\Temp\neu.txt"  
set "ersetzen_durch=0.0.0.0"  

set R=%temp%\ReplaceIP.vbs
> %R% echo Set a=WScript.Arguments:Set fso=CreateObject("Scripting.FileSystemObject"):T=fso.OpenTextFile(a(0)).ReadAll  
>>%R% echo Set rE=New RegExp:rE.Global=True:rE.Pattern="\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"  
>>%R% echo fso.CreateTextFile(a(1)).Write rE.Replace(T,a(2))

cscript //nologo %R% "%quell_datei%" "%ziel_datei%" "%ersetzen_durch%" 
Hinsichtlich der Beibehaltung von Leerzeilen noch ein Tipp: Mit einer Schleife der Art
FOR /f "tokens=1* delims=:" %%i IN ('FINDSTR /n "^" "%quell_datei%"') DO SET zeile=%%j & CALL :ersetzen
kannst Du im Unterprogramm einfach mittels
if not defined zeile echo\ & goto :eof
eine Leerzeile ausgeben und gleich wieder den Rücksprung vornehmen oder die Variable %zeile% (wegen des Unterprogramms ist übrigens keine "delayedexpansion" erforderlich und auch das Ersetzen ließe sich mit
call set "zeile=%%zeile:%suchen_nach%=%ersetzen_durch%%%"
lösen) weiter verarbeiten.

Grüße
bastla
Member: mafiosi
mafiosi Dec 09, 2010 at 20:57:34 (UTC)
Goto Top
Vielen Dank bastla für die überaus schnelle Hilfe!

Deine Lösung mit einem VBScript ist wesentlich performanter als mein Ansatz, das ganze komplett in einer Batch zu lösen!

VG

mafiosi