ppm007
Goto Top

Batch: CRLF nach Suchen und Ersetzen in Datei

Habe öfters ein Text File in dem ich bestimmte strings ersetzen muss und dazu dieses Batch gefunden:

@echo on & setlocal enabledelayedexpansion
set "Datei=c:\noname.sx"     
set "Datei2=c:\noname.s19"     
set "Von=S725"    
set "Nach=S325"    
set "t=%temp%\text.tmp"     
if exist "%t%" del "%t%"     
for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & set Line=!Line:%Von%=%Nach%! & echo !Line!>>"%t%"     
move /y "%t%" "%Datei2%"   

Der zu ersetzende Text ist eindeutig und das Batch funktioniert auch.

Aber:
es fügt an das Ende jeder Zeile CRLF (Hex 20 20 0D 0A) hinzu, was kontraproduktiv ist.
Wie kann ich das vermeiden

Danke für alle Antworten

Content-ID: 671887

Url: https://administrator.de/forum/batch-crlf-nach-suchen-und-ersetzen-in-datei-671887.html

Ausgedruckt am: 12.03.2025 um 16:03 Uhr

BiberMan
BiberMan 12.03.2025 aktualisiert um 13:13:48 Uhr
Goto Top
https://stackoverflow.com/questions/7105433/windows-batch-echo-without-n ...

echo|set /p="Dein String ohne abschließenden Zeilenumbruch"
mbehrens
mbehrens 12.03.2025 um 13:19:04 Uhr
Goto Top
Zitat von @ppm007:

Wie kann ich das vermeiden

Nutze PowerShell mit einer passenden
(Get-Content -Path <file>).Replace (<von>, <nach>) | Set-Content <file>
Kombination.
ppm007
ppm007 12.03.2025 um 13:59:28 Uhr
Goto Top
von:
for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & set Line=!Line:%Von%=%Nach%! & echo !Line!>>"%t%"
nach:
for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & set Line=!Line:%Von%=%Nach%! & echo|set /p= !Line!>>"%t%"

funktioniert leider nicht, Datei hat Größe 0
BiberMan
BiberMan 12.03.2025 aktualisiert um 14:37:26 Uhr
Goto Top
funktioniert leider nicht
doch, so machen ...
@echo off & setlocal enabledelayedexpansion
set "Datei=c:\noname.sx"       
set "Datei2=c:\noname.s19"       
set "Von=S725"      
set "Nach=S325"      
set "t=%temp%\text.tmp"       
if exist "%t%" del "%t%"       
>"%t%" (for /f "usebackq delims=" %%i in ("%Datei%") do (  
    set "Line=%%i"  
    echo|set /p="!Line:%Von%=%Nach%!"  
))
move /y "%t%" "%Datei2%"  


Aber eher besser gleich die Powershell nehmen ...
[IO.File]::WriteAllText("C:\noname.s19",(Get-Content "C:\noname.sx" -raw).replace('S725','S325'))  
ppm007
ppm007 12.03.2025 um 15:01:56 Uhr
Goto Top
Danke
funktioniert leider auch nicht
jetzt hat ist in der Ausgabedatei alles in einer Zeile

mit Powershell habe ich keinen Verwandten
BiberMan
BiberMan 12.03.2025 aktualisiert um 15:17:21 Uhr
Goto Top
Zitat von @ppm007:
jetzt hat ist in der Ausgabedatei alles in einer Zeile
Wolltest du doch so, du wolltest die Zeilenenden entfernen... wie bitte willst du mehrere Zeilen voneinander "ohne" CRLF / LF trennen????, Zeilen werden Standardmäßig damit getrennt, ganz ohne geht es nicht, nur wenn es nur eine einzige Zeile ist dann schon ...
mit Powershell habe ich keinen Verwandten
face-big-smile ??

Ich sag nur Datei-Encoding, da bekommst du mit Batch wirklich Spaß ...
ppm007
ppm007 12.03.2025 um 16:10:23 Uhr
Goto Top
Im original file ist in Binär Ansicht kein CRLF 0x00000D0A vorhanden und die Zeilen sind im Editor untereinander,
und so soll das geänderte File auch aussehen.
Ich vergleiche Files mit dem Totalcommander und das funktioniert nicht wenn CRLF's drinnen sind oder alles
in einer Zeile steht.
BiberMan
BiberMan 12.03.2025 aktualisiert um 17:31:10 Uhr
Goto Top
und die Zeilen sind im Editor untereinander,
Dann muss da aber mindestens ein LF (nach Linux Gusto) drin stehen,....

p.s. PS funktioniert auch in Batch 😋
@echo off
powershell -EP Bypass -C "[IO.File]::WriteAllText('C:\noname.s19',(Get-Content 'C:\noname.sx' -raw).replace('S725','S325'))"